From c585fd9b9f126cb3cd0492a8c8cfe07d82f617db Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Sun, 16 Aug 2015 23:28:15 +0900 Subject: [PATCH 01/18] Need to consider cross and non-cross joins together --- .../org/apache/tajo/algebra/Aggregation.java | 2 +- .../java/org/apache/tajo/SessionVars.java | 7 +- .../java/org/apache/tajo/conf/TajoConf.java | 5 +- .../tajo/engine/query/TestInnerJoinQuery.java | 5 ++ .../tajo/engine/query/TestJoinQuery.java | 12 ++- .../engine/query/TestMultipleJoinTypes.java | 5 ++ .../BaseGlobalPlanRewriteRuleProvider.java | 7 +- ...le.java => AbstractBroadcastJoinRule.java} | 81 +++++++++---------- .../rules/BroadcastJoinRuleForCrossJoin.java | 37 +++++++++ .../BroadcastJoinRuleForNonCrossJoin.java | 31 +++++++ .../global/verifier/GlobalPlanVerifier.java | 46 +++++++++++ .../tajo/master/exec/QueryExecutor.java | 34 +++++--- .../tajo/querymaster/QueryMasterTask.java | 5 ++ .../org/apache/tajo/plan/LogicalPlanner.java | 1 + 14 files changed, 214 insertions(+), 64 deletions(-) rename tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/{BroadcastJoinRule.java => AbstractBroadcastJoinRule.java} (87%) create mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java create mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.java create mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.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 8bcd7e2998..c44e1bbf01 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 Object clone() throws CloneNotSupportedException { } } - public static enum GroupType { + public enum GroupType { OrdinaryGroup(""), Cube("Cube"), Rollup("Rollup"), 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 6c7d07597a..7d47c23a32 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")), 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 1f7f2fa1c0..23b5a91605 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 static enum ConfVars implements ConfigKey { // 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), 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 88b35487e1..4328e8e0b8 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 @@ -63,6 +63,11 @@ public final void testCrossJoin() throws Exception { runSimpleTests(); } + @Test + public final void testCrossJoin2() throws Exception { + executeString("select * from nation n1, nation n2"); + } + @Test @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true) @SimpleTest() 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 2fddbfa7c4..9074503a07 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 @@ -60,7 +60,10 @@ public TestJoinQuery(String joinOption) throws Exception { 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, + "" + (1 * 1024)); testingCluster.setAllTajoDaemonConfValue( ConfVars.$EXECUTOR_HASH_JOIN_SIZE_THRESHOLD.varname, @@ -73,7 +76,6 @@ public TestJoinQuery(String joinOption) throws Exception { 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) { @@ -113,8 +115,10 @@ public static void setup() throws Exception { 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, diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java index d3cde3dfd5..e012d42f6f 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java @@ -103,4 +103,9 @@ public void testComplexJoinsWithCaseWhen2() throws Exception { public final void testInnerAndOuterWithEmpty() throws Exception { runSimpleTests(); } + + @Test + public final void testCrossAndNonCross() 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"); + } } 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 1ae405632d..eb6439291a 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 @@ -20,7 +20,9 @@ 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.engine.planner.global.rewriter.rules.AbstractBroadcastJoinRule; +import org.apache.tajo.engine.planner.global.rewriter.rules.BroadcastJoinRuleForCrossJoin; +import org.apache.tajo.engine.planner.global.rewriter.rules.BroadcastJoinRuleForNonCrossJoin; import org.apache.tajo.util.TUtil; import java.util.Collection; @@ -37,7 +39,8 @@ public BaseGlobalPlanRewriteRuleProvider(TajoConf conf) { @Override public Collection> getRules() { List> rules = Lists.newArrayList(); - rules.add(BroadcastJoinRule.class); + rules.add(BroadcastJoinRuleForCrossJoin.class); + rules.add(BroadcastJoinRuleForNonCrossJoin.class); return rules; } } 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/AbstractBroadcastJoinRule.java similarity index 87% rename from tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java rename to tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/AbstractBroadcastJoinRule.java index 12c3e73a3f..c0ad6e2827 100644 --- 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/AbstractBroadcastJoinRule.java @@ -19,14 +19,12 @@ 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.algebra.JoinType; 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.exception.TajoException; -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; @@ -36,7 +34,7 @@ import java.util.*; /** - * {@link BroadcastJoinRule} converts repartition join plan into broadcast join plan. + * {@link AbstractBroadcastJoinRule} converts repartition join plan into broadcast join plan. * Broadcast join rules can be defined as follows. * *

Broadcastable relation

@@ -60,33 +58,23 @@ * * */ -public class BroadcastJoinRule implements GlobalPlanRewriteRule { +public abstract class AbstractBroadcastJoinRule implements GlobalPlanRewriteRule { - private BroadcastJoinPlanBuilder planBuilder; - private BroadcastJoinPlanFinalizer planFinalizer; - - @Override - public String getName() { - return "BroadcastJoinRule"; + protected enum RewriteScope { + CROSS, + NON_CROSS } - @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; + private BroadcastJoinPlanBuilder planBuilder; + private BroadcastJoinPlanFinalizer planFinalizer; + private RewriteScope scope; + + protected void init(RewriteScope scope, MasterPlan plan, long broadcastThreshold) { + GlobalPlanRewriteUtil.ParentFinder parentFinder = new GlobalPlanRewriteUtil.ParentFinder(); + RelationSizeComparator relSizeComparator = new RelationSizeComparator(); + planBuilder = new BroadcastJoinPlanBuilder(plan, relSizeComparator, parentFinder, broadcastThreshold); + planFinalizer = new BroadcastJoinPlanFinalizer(plan, relSizeComparator); + this.scope = scope; } @Override @@ -116,7 +104,7 @@ public int compare(ScanNode o1, ScanNode o2) { * {@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 { + private class BroadcastJoinPlanFinalizer implements DirectedGraphVisitor { private final MasterPlan plan; private final RelationSizeComparator relSizeComparator; @@ -141,7 +129,7 @@ public void visit(Stack stack, ExecutionBlockId currentId) { } } - private static class BroadcastJoinPlanBuilder implements DirectedGraphVisitor { + private class BroadcastJoinPlanBuilder implements DirectedGraphVisitor { private final MasterPlan plan; private final RelationSizeComparator relSizeComparator; private final long broadcastSizeThreshold; @@ -192,7 +180,7 @@ 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()) { + if (needRewrite(current)) { List childs = plan.getChilds(current); Map unionScanMap = current.getUnionScanMap(); @@ -228,6 +216,23 @@ private void visitNonLeafNode(ExecutionBlock current) { } } + private boolean needRewrite(ExecutionBlock block) { + if (block.hasJoin()) { + if (scope == RewriteScope.CROSS) { + JoinNode join = PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN); + if (join.getJoinType() == JoinType.CROSS) { + return true; + } + } else if (scope == RewriteScope.NON_CROSS) { + JoinNode join = PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN); + if (join.getJoinType() != JoinType.CROSS) { + return true; + } + } + } + return false; + } + /** * 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. @@ -235,19 +240,13 @@ private void visitNonLeafNode(ExecutionBlock current) { * @param block */ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { - List broadcastCandidates = TUtil.newList(); - for (ScanNode scanNode : block.getScanNodes()) { - long estimatedRelationSize = GlobalPlanRewriteUtil.getTableVolume(scanNode); - if (estimatedRelationSize > 0 && estimatedRelationSize <= broadcastSizeThreshold) { - broadcastCandidates.add(scanNode); - } - } + List broadcastCandidates = TUtil.newList(block.getBroadcastRelations()); 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++) { + int i, candidateNum = broadcastCandidates.size(); + for (i = 0; i < candidateNum; i++) { long volumeOfCandidate = GlobalPlanRewriteUtil.getTableVolume(broadcastCandidates.get(i)); if (totalBroadcastVolume + volumeOfCandidate > broadcastSizeThreshold) { break; @@ -255,7 +254,7 @@ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { totalBroadcastVolume += volumeOfCandidate; } - for (; i < broadcastCandidates.size(); ) { + for (; i < candidateNum; ) { ScanNode nonBroadcast = broadcastCandidates.remove(i); block.removeBroadcastRelation(nonBroadcast); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java new file mode 100644 index 0000000000..91bf611ac7 --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java @@ -0,0 +1,37 @@ +package org.apache.tajo.engine.planner.global.rewriter.rules; + +import org.apache.tajo.OverridableConf; +import org.apache.tajo.SessionVars; +import org.apache.tajo.algebra.JoinType; +import org.apache.tajo.engine.planner.global.MasterPlan; +import org.apache.tajo.plan.LogicalPlan; + +public class BroadcastJoinRuleForCrossJoin extends AbstractBroadcastJoinRule { + + @Override + public String getName() { + return "Broadcast join rule for cross join"; + } + + @Override + public boolean isEligible(OverridableConf queryContext, MasterPlan plan) { + for (LogicalPlan.QueryBlock block : plan.getLogicalPlan().getQueryBlocks()) { + // Broadcast join is enforced whether the SessionVars.TEST_BROADCAST_JOIN_ENABLED is set or not. + + // TODO: check containsJoinType() + if (block.containsJoinType(JoinType.CROSS)) { + // The broadcast threshold for cross join is always expected to be smaller than or equal to + // that for non-cross join. + long broadcastThreshold = queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD); + broadcastThreshold = queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD) < broadcastThreshold ? + queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD) : broadcastThreshold; + + if (broadcastThreshold > 0) { + init(RewriteScope.CROSS, plan, broadcastThreshold); + return true; + } + } + } + return false; + } +} diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.java new file mode 100644 index 0000000000..bf5f3e815f --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.java @@ -0,0 +1,31 @@ +package org.apache.tajo.engine.planner.global.rewriter.rules; + +import org.apache.tajo.OverridableConf; +import org.apache.tajo.SessionVars; +import org.apache.tajo.engine.planner.global.MasterPlan; +import org.apache.tajo.plan.LogicalPlan; +import org.apache.tajo.plan.logical.NodeType; + +public class BroadcastJoinRuleForNonCrossJoin extends AbstractBroadcastJoinRule { + + @Override + public String getName() { + return "Broadcast join rule for non-cross join"; + } + + @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_NON_CROSS_JOIN_THRESHOLD); + if (broadcastSizeThreshold > 0) { + init(RewriteScope.NON_CROSS, plan, broadcastSizeThreshold); + return true; + } + } + } + } + return false; + } +} diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java new file mode 100644 index 0000000000..251372b792 --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java @@ -0,0 +1,46 @@ +package org.apache.tajo.engine.planner.global.verifier; + +import org.apache.tajo.ExecutionBlockId; +import org.apache.tajo.algebra.JoinType; +import org.apache.tajo.engine.planner.global.ExecutionBlock; +import org.apache.tajo.engine.planner.global.MasterPlan; +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.plan.verifier.VerificationState; +import org.apache.tajo.util.graph.DirectedGraphVisitor; + +import java.util.Stack; + +public class GlobalPlanVerifier implements DirectedGraphVisitor { + private MasterPlan plan; + private VerificationState state; + + public VerificationState verify(MasterPlan plan) { + this.plan = plan; + this.state = new VerificationState(); + plan.accept(plan.getRoot().getId(), this); + return state; + } + + @Override + public void visit(Stack stack, ExecutionBlockId executionBlockId) { + ExecutionBlock block = plan.getExecBlock(executionBlockId); + if (block.hasJoin()) { + LogicalNode[] joinNodes = PlannerUtil.findAllNodes(block.getPlan(), NodeType.JOIN); + boolean containCrossJoin = false; + for (LogicalNode eachNode : joinNodes) { + if (((JoinNode)eachNode).getJoinType() == JoinType.CROSS) { + containCrossJoin = true; + break; + } + } + if (containCrossJoin) { + // In the case of cross join, this execution block must be executed with broadcast join. + assert block.getBroadcastRelations().size() > 0; + assert block.getNonBroadcastRelNum() < 2; + } + } + } +} 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 bd5d69651a..95ea70cc8d 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 @@ -37,6 +37,8 @@ import org.apache.tajo.engine.planner.physical.EvalExprExec; import org.apache.tajo.engine.planner.physical.InsertRowsExec; import org.apache.tajo.engine.query.QueryContext; +import org.apache.tajo.exception.TajoException; +import org.apache.tajo.exception.UndefinedTableException; import org.apache.tajo.ipc.ClientProtos.SerializedResultSet; import org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse; import org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse.ResultType; @@ -494,19 +496,7 @@ public void executeDistributedQuery(QueryContext queryContext, Session session, SubmitQueryResponse.Builder responseBuilder) throws Exception { LogicalRootNode rootNode = plan.getRootBlock().getRoot(); - TableDesc tableDesc = PlannerUtil.getTableDesc(catalog, plan.getRootBlock().getRoot()); - if (tableDesc != null) { - - Tablespace space = TablespaceManager.get(tableDesc.getUri()).get(); - FormatProperty formatProperty = space.getFormatProperty(tableDesc.getMeta()); - - if (!formatProperty.isInsertable()) { - throw new VerifyException( - String.format("%s tablespace does not allow INSERT operation.", tableDesc.getUri().toString())); - } - - space.prepareTable(rootNode.getChild()); - } + prepareForCreateTableOrInsert(catalog, plan); hookManager.doHooks(queryContext, plan); @@ -526,6 +516,24 @@ public void executeDistributedQuery(QueryContext queryContext, Session session, " is forwarded to " + queryInfo.getQueryMasterHost() + ":" + queryInfo.getQueryMasterPort()); } + private void prepareForCreateTableOrInsert(CatalogService catalog, LogicalPlan plan) + throws TajoException, VerifyException, IOException { + LogicalRootNode rootNode = plan.getRootBlock().getRoot(); + TableDesc tableDesc = PlannerUtil.getTableDesc(catalog, plan.getRootBlock().getRoot()); + if (tableDesc != null) { + + Tablespace space = TablespaceManager.get(tableDesc.getUri()).get(); + FormatProperty formatProperty = space.getFormatProperty(tableDesc.getMeta()); + + if (!formatProperty.isInsertable()) { + throw new VerifyException( + String.format("%s tablespace does not allow INSERT operation.", tableDesc.getUri().toString())); + } + + space.prepareTable(rootNode.getChild()); + } + } + private void checkIndexExistence(final QueryContext queryContext, final CreateIndexNode createIndexNode) throws DuplicateIndexException { 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 c6e2b350df..7f29c2116a 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 @@ -36,6 +36,7 @@ import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.planner.global.MasterPlan; +import org.apache.tajo.engine.planner.global.verifier.GlobalPlanVerifier; import org.apache.tajo.engine.query.QueryContext; import org.apache.tajo.exception.TajoException; import org.apache.tajo.ipc.TajoWorkerProtocol; @@ -358,6 +359,10 @@ public synchronized void startQuery() { MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan); queryMasterContext.getGlobalPlanner().build(queryContext, masterPlan); + // Checking is required to guarantee that cross join is always executed with broadcast join. + GlobalPlanVerifier verifier = new GlobalPlanVerifier(); + verifier.verify(masterPlan); + query = new Query(queryTaskContext, queryId, querySubmitTime, "", queryTaskContext.getEventHandler(), masterPlan); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java index 4b17b0ee89..f70731fcc8 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java @@ -1267,6 +1267,7 @@ private LogicalNode createCartesianProduct(PlanContext context, LogicalNode left JoinNode join = plan.createNode(JoinNode.class); join.init(JoinType.CROSS, left, right); join.setInSchema(merged); + block.addJoinType(join.getJoinType()); EvalNode evalNode; List newlyEvaluatedExprs = TUtil.newList(); From b2c8435a886c8008598c367e5e757b601148cfac Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 17 Aug 2015 15:18:01 +0900 Subject: [PATCH 02/18] TAJO-1766 --- .../BaseGlobalPlanRewriteRuleProvider.java | 7 +- ...stJoinRule.java => BroadcastJoinRule.java} | 160 +++++++++++------- .../rules/BroadcastJoinRuleForCrossJoin.java | 37 ---- .../BroadcastJoinRuleForNonCrossJoin.java | 31 ---- .../rewriter/rules/GlobalPlanRewriteUtil.java | 35 ++-- .../global/verifier/GlobalPlanVerifier.java | 18 ++ .../tajo/querymaster/Repartitioner.java | 7 +- 7 files changed, 140 insertions(+), 155 deletions(-) rename tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/{AbstractBroadcastJoinRule.java => BroadcastJoinRule.java} (72%) delete mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java delete mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.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 eb6439291a..1ae405632d 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 @@ -20,9 +20,7 @@ import com.google.common.collect.Lists; import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.engine.planner.global.rewriter.rules.AbstractBroadcastJoinRule; -import org.apache.tajo.engine.planner.global.rewriter.rules.BroadcastJoinRuleForCrossJoin; -import org.apache.tajo.engine.planner.global.rewriter.rules.BroadcastJoinRuleForNonCrossJoin; +import org.apache.tajo.engine.planner.global.rewriter.rules.BroadcastJoinRule; import org.apache.tajo.util.TUtil; import java.util.Collection; @@ -39,8 +37,7 @@ public BaseGlobalPlanRewriteRuleProvider(TajoConf conf) { @Override public Collection> getRules() { List> rules = Lists.newArrayList(); - rules.add(BroadcastJoinRuleForCrossJoin.class); - rules.add(BroadcastJoinRuleForNonCrossJoin.class); + rules.add(BroadcastJoinRule.class); return rules; } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/AbstractBroadcastJoinRule.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java similarity index 72% rename from tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/AbstractBroadcastJoinRule.java rename to tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java index c0ad6e2827..530f57e5e3 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/AbstractBroadcastJoinRule.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java @@ -19,13 +19,16 @@ 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.algebra.JoinType; 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.exception.TajoException; -import org.apache.tajo.plan.PlanningException; +import org.apache.tajo.exception.TajoInternalError; +import org.apache.tajo.plan.LogicalPlan; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.util.TUtil; @@ -34,7 +37,7 @@ import java.util.*; /** - * {@link AbstractBroadcastJoinRule} converts repartition join plan into broadcast join plan. + * {@link BroadcastJoinRule} converts repartition join plan into broadcast join plan. * Broadcast join rules can be defined as follows. * *

Broadcastable relation

@@ -58,23 +61,38 @@ * * */ -public abstract class AbstractBroadcastJoinRule implements GlobalPlanRewriteRule { - - protected enum RewriteScope { - CROSS, - NON_CROSS - } +public class BroadcastJoinRule implements GlobalPlanRewriteRule { private BroadcastJoinPlanBuilder planBuilder; private BroadcastJoinPlanFinalizer planFinalizer; - private RewriteScope scope; - protected void init(RewriteScope scope, MasterPlan plan, long broadcastThreshold) { + protected void init(MasterPlan plan, long thresholdForNonCrossJoin, long thresholdForCrossJoin) { GlobalPlanRewriteUtil.ParentFinder parentFinder = new GlobalPlanRewriteUtil.ParentFinder(); RelationSizeComparator relSizeComparator = new RelationSizeComparator(); - planBuilder = new BroadcastJoinPlanBuilder(plan, relSizeComparator, parentFinder, broadcastThreshold); + planBuilder = new BroadcastJoinPlanBuilder(plan, relSizeComparator, parentFinder, thresholdForNonCrossJoin, + thresholdForCrossJoin); planFinalizer = new BroadcastJoinPlanFinalizer(plan, relSizeComparator); - this.scope = scope; + } + + @Override + public String getName() { + return "Broadcast join rule"; + } + + @Override + public boolean isEligible(OverridableConf queryContext, MasterPlan plan) { + long thresholdForNonCrossJoin = queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD); + long thresholdForCrossJoin = queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD); + if (queryContext.getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED) && thresholdForNonCrossJoin > 0 + || thresholdForCrossJoin > 0) { + for (LogicalPlan.QueryBlock block : plan.getLogicalPlan().getQueryBlocks()) { + if (block.hasNode(NodeType.JOIN)) { + init(plan, thresholdForNonCrossJoin, thresholdForCrossJoin); + return true; + } + } + } + return false; } @Override @@ -132,14 +150,18 @@ public void visit(Stack stack, ExecutionBlockId currentId) { private class BroadcastJoinPlanBuilder implements DirectedGraphVisitor { private final MasterPlan plan; private final RelationSizeComparator relSizeComparator; - private final long broadcastSizeThreshold; + private final long thresholdForNonCrossJoin; + private final long thresholdForCrossJoin; private final GlobalPlanRewriteUtil.ParentFinder parentFinder; + private final Map estimatedEbOutputSize = TUtil.newHashMap(); public BroadcastJoinPlanBuilder(MasterPlan plan, RelationSizeComparator relationSizeComparator, - GlobalPlanRewriteUtil.ParentFinder parentFinder, long broadcastSizeThreshold) { + GlobalPlanRewriteUtil.ParentFinder parentFinder, + long thresholdForNonCrossJoin, long thresholdForCrossJoin) { this.plan = plan; this.relSizeComparator = relationSizeComparator; - this.broadcastSizeThreshold = broadcastSizeThreshold; + this.thresholdForNonCrossJoin = thresholdForNonCrossJoin; + this.thresholdForCrossJoin = thresholdForCrossJoin; this.parentFinder = parentFinder; } @@ -154,58 +176,61 @@ public void visit(Stack stack, ExecutionBlockId executionBlock } } + /** + * Estimate the result size of leaf blocks. + * + * @param current + */ private void visitLeafNode(ExecutionBlock current) { - // At leaf execution blocks, find input relations who's size is smaller than the predefined threshold. + // Preserved-row relations must not be broadcasted to avoid data duplication. if (!current.isPreservedRow()) { - // Preserved-row relations must not be broadcasted to avoid data duplication. - boolean fullyBroadcastable = true; + // Assume that the output size is equal to the input size. + long totalVolume = 0; 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. - } + totalVolume += GlobalPlanRewriteUtil.getTableVolume(scanNode); } + estimatedEbOutputSize.put(current.getId(), totalVolume); } } + /** + * 1. Based on the join type, find broadcastable relations of the child execution blocks. + * 2. Update the current block's inputs based on the broadcastability of the child blocks. + * 3. Merge child blocks and the current block if the scan to the corresponding child block is broadcastable. + * 4. Estimate the result size of the current block. + * + * @param current + */ private void visitNonLeafNode(ExecutionBlock current) { // At non-leaf execution blocks, merge broadcastable children's plan with the current plan. if (!plan.isTerminal(current)) { - if (needRewrite(current)) { + if (current.hasJoin()) { List childs = plan.getChilds(current); Map unionScanMap = current.getUnionScanMap(); + LogicalNode found = PlannerUtil.findTopNode(current.getPlan(), NodeType.JOIN); + if (found == null) { + throw new TajoInternalError("ExecutionBlock " + current.getId() + " doesn't have any join operator, " + + "but the master plan indicates that it has."); + } + JoinType joinType = ((JoinNode)found).getJoinType(); + + for (ExecutionBlock child : childs) { + updateBroadcastableRelForChildEb(child, joinType); + updateInputBasedOnChildEb(child, current); + } 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); - } + addUnionNodeIfNecessary(unionScanMap, plan, child, current); + mergeTwoPhaseJoin(plan, child, current); } 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); - } - } + long outputVolume = 0; + estimatedEbOutputSize.put(current.getId(), outputVolume); } } else { List relations = TUtil.newList(current.getBroadcastRelations()); @@ -216,21 +241,27 @@ private void visitNonLeafNode(ExecutionBlock current) { } } - private boolean needRewrite(ExecutionBlock block) { - if (block.hasJoin()) { - if (scope == RewriteScope.CROSS) { - JoinNode join = PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN); - if (join.getJoinType() == JoinType.CROSS) { - return true; - } - } else if (scope == RewriteScope.NON_CROSS) { - JoinNode join = PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN); - if (join.getJoinType() != JoinType.CROSS) { - return true; + private void updateInputBasedOnChildEb(ExecutionBlock child, ExecutionBlock parent) { + if (!child.isPreservedRow() && isFullyBroadcastable(child)) { + if (plan.isLeaf(child) && child.getScanNodes().length == 1) { + try { + updateScanOfParentAsBroadcastable(plan, child, parent); + } catch (TajoInternalError e) { + // This case is when the current has two or more inputs via union, and simply ignored. } + } else { + updateScanOfParentAsBroadcastable(plan, child, parent); + } + } + } + + private void updateBroadcastableRelForChildEb(ExecutionBlock child, JoinType joinType) { + long threshold = joinType == JoinType.CROSS ? thresholdForCrossJoin : thresholdForNonCrossJoin; + for (ScanNode scanNode : child.getScanNodes()) { + if (GlobalPlanRewriteUtil.getTableVolume(scanNode) <= threshold) { + child.addBroadcastRelation(scanNode); } } - return false; } /** @@ -245,10 +276,12 @@ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { // Enforce broadcast for candidates in ascending order of relation size long totalBroadcastVolume = 0; + long largeThreshold = thresholdForCrossJoin > thresholdForNonCrossJoin ? + thresholdForNonCrossJoin : thresholdForCrossJoin; int i, candidateNum = broadcastCandidates.size(); for (i = 0; i < candidateNum; i++) { long volumeOfCandidate = GlobalPlanRewriteUtil.getTableVolume(broadcastCandidates.get(i)); - if (totalBroadcastVolume + volumeOfCandidate > broadcastSizeThreshold) { + if (totalBroadcastVolume + volumeOfCandidate > largeThreshold) { break; } totalBroadcastVolume += volumeOfCandidate; @@ -260,8 +293,8 @@ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { } } - private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock current) throws PlanningException { - ExecutionBlock parent = plan.getParent(current); + private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock current, ExecutionBlock parent) + throws TajoInternalError { if (parent != null && !plan.isTerminal(parent)) { ScanNode scanForCurrent = GlobalPlanRewriteUtil.findScanForChildEb(current, parent); parent.addBroadcastRelation(scanForCurrent); @@ -277,7 +310,7 @@ private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock c * @return */ private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent) - throws PlanningException { + throws TajoInternalError { ScanNode scanForChild = GlobalPlanRewriteUtil.findScanForChildEb(child, parent); parentFinder.set(scanForChild); @@ -300,8 +333,7 @@ private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, } private void addUnionNodeIfNecessary(Map unionScanMap, MasterPlan plan, - ExecutionBlock child, ExecutionBlock current) - throws PlanningException { + ExecutionBlock child, ExecutionBlock current) { if (unionScanMap != null) { List unionScans = TUtil.newList(); ExecutionBlockId representativeId = null; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java deleted file mode 100644 index 91bf611ac7..0000000000 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForCrossJoin.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.apache.tajo.engine.planner.global.rewriter.rules; - -import org.apache.tajo.OverridableConf; -import org.apache.tajo.SessionVars; -import org.apache.tajo.algebra.JoinType; -import org.apache.tajo.engine.planner.global.MasterPlan; -import org.apache.tajo.plan.LogicalPlan; - -public class BroadcastJoinRuleForCrossJoin extends AbstractBroadcastJoinRule { - - @Override - public String getName() { - return "Broadcast join rule for cross join"; - } - - @Override - public boolean isEligible(OverridableConf queryContext, MasterPlan plan) { - for (LogicalPlan.QueryBlock block : plan.getLogicalPlan().getQueryBlocks()) { - // Broadcast join is enforced whether the SessionVars.TEST_BROADCAST_JOIN_ENABLED is set or not. - - // TODO: check containsJoinType() - if (block.containsJoinType(JoinType.CROSS)) { - // The broadcast threshold for cross join is always expected to be smaller than or equal to - // that for non-cross join. - long broadcastThreshold = queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD); - broadcastThreshold = queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD) < broadcastThreshold ? - queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD) : broadcastThreshold; - - if (broadcastThreshold > 0) { - init(RewriteScope.CROSS, plan, broadcastThreshold); - return true; - } - } - } - return false; - } -} diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.java deleted file mode 100644 index bf5f3e815f..0000000000 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRuleForNonCrossJoin.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.apache.tajo.engine.planner.global.rewriter.rules; - -import org.apache.tajo.OverridableConf; -import org.apache.tajo.SessionVars; -import org.apache.tajo.engine.planner.global.MasterPlan; -import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.logical.NodeType; - -public class BroadcastJoinRuleForNonCrossJoin extends AbstractBroadcastJoinRule { - - @Override - public String getName() { - return "Broadcast join rule for non-cross join"; - } - - @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_NON_CROSS_JOIN_THRESHOLD); - if (broadcastSizeThreshold > 0) { - init(RewriteScope.NON_CROSS, plan, broadcastSizeThreshold); - return true; - } - } - } - } - return false; - } -} 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 index cc98300b50..28eab0a972 100644 --- 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 @@ -18,10 +18,11 @@ package org.apache.tajo.engine.planner.global.rewriter.rules; +import org.apache.tajo.algebra.JoinType; 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.exception.TajoInternalError; import org.apache.tajo.plan.logical.*; import java.util.List; @@ -71,10 +72,10 @@ public static ExecutionBlock mergeExecutionBlocks(MasterPlan plan, ExecutionBloc * @param newChild * @param originalChild * @param parent - * @throws PlanningException + * @throws TajoInternalError */ public static void replaceChild(LogicalNode newChild, ScanNode originalChild, LogicalNode parent) - throws PlanningException { + throws TajoInternalError { if (parent instanceof UnaryNode) { ((UnaryNode) parent).setChild(newChild); } else if (parent instanceof BinaryNode) { @@ -84,10 +85,10 @@ public static void replaceChild(LogicalNode newChild, ScanNode originalChild, Lo } else if (binary.getRightChild().equals(originalChild)) { binary.setRightChild(newChild); } else { - throw new PlanningException(originalChild.getPID() + " is not a child of " + parent.getPID()); + throw new TajoInternalError(originalChild.getPID() + " is not a child of " + parent.getPID()); } } else { - throw new PlanningException(parent.getPID() + " seems to not have any children"); + throw new TajoInternalError(parent.getPID() + " seems to not have any children"); } } @@ -97,9 +98,9 @@ public static void replaceChild(LogicalNode newChild, ScanNode originalChild, Lo * @param child * @param parent * @return - * @throws PlanningException + * @throws TajoInternalError */ - public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock parent) throws PlanningException { + public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock parent) throws TajoInternalError { ScanNode scanForChild = null; for (ScanNode scanNode : parent.getScanNodes()) { if (scanNode.getTableName().equals(child.getId().toString())) { @@ -108,7 +109,7 @@ public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock p } } if (scanForChild == null) { - throw new PlanningException("Cannot find any scan nodes for " + child.getId() + " in " + parent.getId()); + throw new TajoInternalError("Cannot find any scan nodes for " + child.getId() + " in " + parent.getId()); } return scanForChild; } @@ -137,7 +138,7 @@ public static long getTableVolume(ScanNode scanNode) { /** * It calculates the total volume of all descendent relation nodes. */ - public static long computeDescendentVolume(LogicalNode node) throws PlanningException { + public static long computeDescendentVolume(LogicalNode node) throws TajoInternalError { if (node instanceof RelationNode) { switch (node.getType()) { @@ -176,7 +177,7 @@ public static long computeDescendentVolume(LogicalNode node) throws PlanningExce return computeDescendentVolume(binaryNode.getLeftChild()) + computeDescendentVolume(binaryNode.getRightChild()); } - throw new PlanningException("Invalid State"); + throw new TajoInternalError("Invalid State at node " + node.getPID()); } public static class ParentFinder implements LogicalNodeVisitor { @@ -192,9 +193,9 @@ public void find(LogicalNode root) { this.visit(root); } - public LogicalNode getFound() throws PlanningException { + public LogicalNode getFound() throws TajoInternalError { if (found == null) { - throw new PlanningException("Cannot find the parent of " + target.getPID()); + throw new TajoInternalError("Cannot find the parent of " + target.getPID()); } return this.found; } @@ -213,4 +214,14 @@ public void visit(LogicalNode node) { } } } + + public static long estimateOutputVolume(ExecutionBlock block) { + // output volume = selectivity * left input row number * right input row number * output row width + // input row number = input size / input row width + return 0; + } + + public static long estimateOutputRowNum(JoinType joinType, ScanNode leftScan, ScanNode rightScan) { + return 0; + } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java index 251372b792..907844cc71 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java @@ -1,3 +1,21 @@ +/** + * 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.verifier; import org.apache.tajo.ExecutionBlockId; 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 53f5504264..0d5880ef14 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 @@ -42,7 +42,6 @@ import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.exception.UndefinedTableException; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.logical.SortNode.SortPurpose; import org.apache.tajo.plan.serder.PlanProto.DistinctGroupbyEnforcer.MultipleAggregationStage; @@ -108,11 +107,7 @@ public static void scheduleFragmentsForJoinQuery(TaskSchedulerContext schedulerC } else { - try { - stats[i] = GlobalPlanRewriteUtil.computeDescendentVolume(scans[i]); - } catch (PlanningException e) { - throw new IOException(e); - } + stats[i] = GlobalPlanRewriteUtil.computeDescendentVolume(scans[i]); // if table has no data, tablespace will return empty FileFragment. // So, we need to handle FileFragment by its size. From 1f974ceb14a62310ade9a7f631ee3ad531f080de Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 17 Aug 2015 18:10:12 +0900 Subject: [PATCH 03/18] TAJO-1766 --- .../rewriter/rules/BroadcastJoinRule.java | 75 +++++++++++++++++++ .../rewriter/rules/GlobalPlanRewriteUtil.java | 11 +-- 2 files changed, 76 insertions(+), 10 deletions(-) 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 index 530f57e5e3..717be432db 100644 --- 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 @@ -22,6 +22,7 @@ import org.apache.tajo.OverridableConf; import org.apache.tajo.SessionVars; import org.apache.tajo.algebra.JoinType; +import org.apache.tajo.catalog.SchemaUtil; import org.apache.tajo.engine.planner.global.ExecutionBlock; import org.apache.tajo.engine.planner.global.GlobalPlanner; import org.apache.tajo.engine.planner.global.MasterPlan; @@ -29,6 +30,7 @@ import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.plan.LogicalPlan; +import org.apache.tajo.plan.joinorder.GreedyHeuristicJoinOrderAlgorithm; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.util.TUtil; @@ -264,6 +266,79 @@ private void updateBroadcastableRelForChildEb(ExecutionBlock child, JoinType joi } } + private long estimateOutputVolume(ExecutionBlock block) { + // output volume = output row number * output row width + return SchemaUtil.estimateRowByteSizeWithSchema(block.getStoreTableNode().getTableSchema()) + * estimateOutputRowNum(PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN)); + } + + private long estimateOutputRowNum(LogicalNode node) throws TajoInternalError { + + 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 estimateOutputRowNum(((TableSubQueryNode) node).getSubQuery()); + default: + throw new IllegalArgumentException("Not RelationNode"); + } + } else if (node instanceof UnaryNode) { + return estimateOutputRowNum(((UnaryNode) node).getChild()); + } else if (node instanceof UnionNode) { + UnionNode binaryNode = (UnionNode) node; + return estimateOutputRowNum(binaryNode.getLeftChild()) + estimateOutputRowNum(binaryNode.getRightChild()); + } else if (node instanceof JoinNode) { + JoinNode joinNode = (JoinNode) node; + JoinSpec joinSpec = joinNode.getJoinSpec(); + long leftChildRowNum = estimateOutputRowNum(joinNode.getLeftChild()); + long rightChildRownum = estimateOutputRowNum(joinNode.getRightChild()); + switch (joinNode.getJoinType()) { + case CROSS: + return leftChildRowNum * rightChildRownum; + case INNER: + return (long) (leftChildRowNum * rightChildRownum * + Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); + case LEFT_OUTER: + return leftChildRowNum; + case RIGHT_OUTER: + return rightChildRownum; + case FULL_OUTER: + return leftChildRowNum < rightChildRownum ? leftChildRowNum : rightChildRownum; + case LEFT_ANTI: + case LEFT_SEMI: + return leftChildRowNum * + Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size()); + case RIGHT_ANTI: + case RIGHT_SEMI: + return rightChildRownum; + } + } + + throw new TajoInternalError("Invalid State at node " + node.getPID()); + } + /** * 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. 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 index 28eab0a972..0824b6f0a4 100644 --- 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 @@ -19,6 +19,7 @@ package org.apache.tajo.engine.planner.global.rewriter.rules; import org.apache.tajo.algebra.JoinType; +import org.apache.tajo.catalog.SchemaUtil; import org.apache.tajo.engine.planner.global.DataChannel; import org.apache.tajo.engine.planner.global.ExecutionBlock; import org.apache.tajo.engine.planner.global.MasterPlan; @@ -214,14 +215,4 @@ public void visit(LogicalNode node) { } } } - - public static long estimateOutputVolume(ExecutionBlock block) { - // output volume = selectivity * left input row number * right input row number * output row width - // input row number = input size / input row width - return 0; - } - - public static long estimateOutputRowNum(JoinType joinType, ScanNode leftScan, ScanNode rightScan) { - return 0; - } } From 90306b6495314c28f4f7bdc1cb54b1ea799c689d Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 17 Aug 2015 19:21:15 +0900 Subject: [PATCH 04/18] TAJO-1766 --- .../rewriter/rules/BroadcastJoinRule.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) 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 index 717be432db..fc1e28269a 100644 --- 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 @@ -231,7 +231,7 @@ private void visitNonLeafNode(ExecutionBlock current) { checkTotalSizeOfBroadcastableRelations(current); - long outputVolume = 0; + long outputVolume = estimateOutputVolume(current); estimatedEbOutputSize.put(current.getId(), outputVolume); } } else { @@ -268,7 +268,7 @@ private void updateBroadcastableRelForChildEb(ExecutionBlock child, JoinType joi private long estimateOutputVolume(ExecutionBlock block) { // output volume = output row number * output row width - return SchemaUtil.estimateRowByteSizeWithSchema(block.getStoreTableNode().getTableSchema()) + return SchemaUtil.estimateRowByteSizeWithSchema(block.getPlan().getOutSchema()) * estimateOutputRowNum(PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN)); } @@ -328,11 +328,12 @@ private long estimateOutputRowNum(LogicalNode node) throws TajoInternalError { return leftChildRowNum < rightChildRownum ? leftChildRowNum : rightChildRownum; case LEFT_ANTI: case LEFT_SEMI: - return leftChildRowNum * - Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size()); + return (long) (leftChildRowNum * + Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); case RIGHT_ANTI: case RIGHT_SEMI: - return rightChildRownum; + return (long) (rightChildRownum * + Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); } } @@ -352,9 +353,9 @@ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { // Enforce broadcast for candidates in ascending order of relation size long totalBroadcastVolume = 0; long largeThreshold = thresholdForCrossJoin > thresholdForNonCrossJoin ? - thresholdForNonCrossJoin : thresholdForCrossJoin; - int i, candidateNum = broadcastCandidates.size(); - for (i = 0; i < candidateNum; i++) { + thresholdForCrossJoin : thresholdForNonCrossJoin; + int i; + for (i = 0; i < broadcastCandidates.size(); i++) { long volumeOfCandidate = GlobalPlanRewriteUtil.getTableVolume(broadcastCandidates.get(i)); if (totalBroadcastVolume + volumeOfCandidate > largeThreshold) { break; @@ -362,7 +363,7 @@ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { totalBroadcastVolume += volumeOfCandidate; } - for (; i < candidateNum; ) { + for (; i < broadcastCandidates.size(); ) { ScanNode nonBroadcast = broadcastCandidates.remove(i); block.removeBroadcastRelation(nonBroadcast); } From 989d0ebd20e4250cd236029a796614f1e64ad891 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Tue, 18 Aug 2015 10:51:36 +0900 Subject: [PATCH 05/18] TAJO-1766 --- .../TooLargeTableForCrossJoinExceptoin.java | 11 ++++++++++ tajo-common/src/main/proto/errors.proto | 21 ++++++++++--------- .../global/verifier/GlobalPlanVerifier.java | 6 ++++-- 3 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java new file mode 100644 index 0000000000..b0f9aacea8 --- /dev/null +++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java @@ -0,0 +1,11 @@ +package org.apache.tajo.exception; + +import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState; + +public class TooLargeTableForCrossJoinExceptoin extends TajoException { + + public TooLargeTableForCrossJoinExceptoin(ReturnState e) { + super(e); + } + +} diff --git a/tajo-common/src/main/proto/errors.proto b/tajo-common/src/main/proto/errors.proto index 405745673b..51eb6d958c 100644 --- a/tajo-common/src/main/proto/errors.proto +++ b/tajo-common/src/main/proto/errors.proto @@ -173,25 +173,26 @@ 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_TABLE_FOR_CROSS_JOIN = 54003; - TOO_MANY_TABLES = 54004; - TOO_MANY_COLUMNS = 54011; - TOO_MANY_ARGUMENTS = 54023; + TOO_MANY_TABLES = 54004; + 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. diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java index 907844cc71..3fb0b2ebdf 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java @@ -56,8 +56,10 @@ public void visit(Stack stack, ExecutionBlockId executionBlock } if (containCrossJoin) { // In the case of cross join, this execution block must be executed with broadcast join. - assert block.getBroadcastRelations().size() > 0; - assert block.getNonBroadcastRelNum() < 2; + // + if (block.getBroadcastRelations().size() == 0 || block.getNonBroadcastRelNum() > 1) { + + } } } } From 96dd4329d1639615f4ffa65b9cf2562d0853e4e0 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Wed, 19 Aug 2015 19:13:47 +0900 Subject: [PATCH 06/18] add post logical plan verification --- .../java/org/apache/tajo/SessionVars.java | 2 + .../java/org/apache/tajo/conf/TajoConf.java | 3 +- .../apache/tajo/exception/ErrorMessages.java | 4 + .../TooLargeInputForCrossJoinException.java | 34 +++ .../TooLargeResultForCrossJoinException.java | 15 ++ .../TooLargeTableForCrossJoinExceptoin.java | 11 - tajo-common/src/main/proto/errors.proto | 23 +- .../tajo/engine/query/TestJoinQuery.java | 2 +- .../engine/query/TestMultipleJoinTypes.java | 10 + .../rewriter/rules/BroadcastJoinRule.java | 6 +- .../global/verifier/GlobalPlanVerifier.java | 7 +- .../engine/planner/physical/BNLJoinExec.java | 6 +- .../org/apache/tajo/master/GlobalEngine.java | 23 +- .../tajo/querymaster/QueryMasterTask.java | 49 +++-- .../tajo/plan/util/PlanVerifierUtil.java | 82 +++++++ .../verifier/PostLogicalPlanVerifier.java | 202 ++++++++++++++++++ 16 files changed, 425 insertions(+), 54 deletions(-) create mode 100644 tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java create mode 100644 tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java delete mode 100644 tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java create mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.java create mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.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 7d47c23a32..af290bbae5 100644 --- a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java +++ b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java @@ -94,6 +94,8 @@ public enum SessionVars implements ConfigKey { 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")), + CROSS_JOIN_RESULT_THRESHOLD(ConfVars.$DIST_QUERY_CROSS_JOIN_RESULT_THRESHOLD, + "restriction for the result size the 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")), 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 23b5a91605..aacaa5d965 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 @@ -312,8 +312,9 @@ public static enum ConfVars implements ConfigKey { // for distributed query strategies $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", + $DIST_QUERY_BROADCAST_CROSS_JOIN_THRESHOLD("tajo.dist-query.broadcast.cross-join.threshold-bytes", (long)1 * 1048576), // 1 MB + $DIST_QUERY_CROSS_JOIN_RESULT_THRESHOLD("tajo.dist-query.cross-join.result.threshold-mb", 1024), // 1 GB $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), 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 ad5776cbea..11aff1faeb 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 @@ -109,6 +109,10 @@ 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 tajo.dist-query.broadcast.cross-join.threshold-bytes.", 1); + ADD_MESSAGE(TOO_LARGE_RESULT_FOR_CROSS_JOIN, "Estimated size of cross join is too large."); 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); 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 0000000000..ec52e09586 --- /dev/null +++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.exception; + +import org.apache.tajo.error.Errors.ResultCode; +import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState; +import org.apache.tajo.util.StringUtils; + +public class TooLargeInputForCrossJoinException extends TajoException { + + public TooLargeInputForCrossJoinException(ReturnState e) { + super(e); + } + + public TooLargeInputForCrossJoinException(String[] relations) { + super(ResultCode.TOO_LARGE_INPUT_FOR_CROSS_JOIN, StringUtils.join(relations)); + } +} diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java new file mode 100644 index 0000000000..e407344ebf --- /dev/null +++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java @@ -0,0 +1,15 @@ +package org.apache.tajo.exception; + +import org.apache.tajo.error.Errors.ResultCode; +import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState; + +public class TooLargeResultForCrossJoinException extends TajoException { + + public TooLargeResultForCrossJoinException(ReturnState e) { + super(e); + } + + public TooLargeResultForCrossJoinException() { + super(ResultCode.TOO_LARGE_RESULT_FOR_CROSS_JOIN); + } +} diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java deleted file mode 100644 index b0f9aacea8..0000000000 --- a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeTableForCrossJoinExceptoin.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.apache.tajo.exception; - -import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState; - -public class TooLargeTableForCrossJoinExceptoin extends TajoException { - - public TooLargeTableForCrossJoinExceptoin(ReturnState e) { - super(e); - } - -} diff --git a/tajo-common/src/main/proto/errors.proto b/tajo-common/src/main/proto/errors.proto index 51eb6d958c..488f60d144 100644 --- a/tajo-common/src/main/proto/errors.proto +++ b/tajo-common/src/main/proto/errors.proto @@ -173,26 +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; - TOO_LARGE_TABLE_FOR_CROSS_JOIN = 54003; + PROGRAM_LIMIT_EXCEEDED = 54000; + STATEMENT_TOO_COMPLEX = 54001; + STRING_CONSTANT_TOOL_LONG = 54002; + TOO_LARGE_INPUT_FOR_CROSS_JOIN = 54003; + TOO_LARGE_RESULT_FOR_CROSS_JOIN = 54004; - TOO_MANY_TABLES = 54004; - TOO_MANY_COLUMNS = 54011; - TOO_MANY_ARGUMENTS = 54023; + TOO_MANY_TABLES = 54005; + 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. 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 5effed514b..00c3c9a706 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 @@ -63,7 +63,7 @@ public TestJoinQuery(String joinOption) throws Exception { testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD.varname, "" + (5 * 1024)); testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_CROSS_JOIN_THRESHOLD.varname, - "" + (1 * 1024)); + "" + (2 * 1024)); testingCluster.setAllTajoDaemonConfValue( ConfVars.$EXECUTOR_HASH_JOIN_SIZE_THRESHOLD.varname, diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java index e012d42f6f..b11bbd8b3e 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java @@ -108,4 +108,14 @@ public final void testInnerAndOuterWithEmpty() throws Exception { public final void testCrossAndNonCross() 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 + public final void testCrossAndNonCross2() throws Exception { + executeString("select * from region full outer join lineitem on r_regionkey = l_orderkey full outer join supplier on s_suppkey = l_suppkey cross join nation"); + } + + @Test + public final void testCrossAndNonCross3() throws Exception { + executeString("select * from nation n1 cross join nation n2"); + } } 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 index fc1e28269a..92691bc351 100644 --- 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 @@ -283,7 +283,8 @@ private long estimateOutputRowNum(LogicalNode node) throws TajoInternalError { // broadcast method. return Long.MAX_VALUE; } else { - return scanNode.getTableDesc().getStats().getNumBytes(); + return scanNode.getTableDesc().getStats().getNumBytes() / + SchemaUtil.estimateRowByteSizeWithSchema(scanNode.getTableDesc().getSchema()); } case PARTITIONS_SCAN: PartitionedTableScanNode pScanNode = (PartitionedTableScanNode) node; @@ -296,7 +297,8 @@ private long estimateOutputRowNum(LogicalNode node) throws TajoInternalError { if (pScanNode.getInputPaths() == null || pScanNode.getInputPaths().length == 0) { return 0; } else { - return pScanNode.getTableDesc().getStats().getNumBytes(); + return pScanNode.getTableDesc().getStats().getNumBytes() / + SchemaUtil.estimateRowByteSizeWithSchema(pScanNode.getTableDesc().getLogicalSchema()); } } case TABLE_SUBQUERY: diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java index 3fb0b2ebdf..05e46b8fd9 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java @@ -22,6 +22,7 @@ import org.apache.tajo.algebra.JoinType; import org.apache.tajo.engine.planner.global.ExecutionBlock; import org.apache.tajo.engine.planner.global.MasterPlan; +import org.apache.tajo.exception.TooLargeInputForCrossJoinException; import org.apache.tajo.plan.logical.JoinNode; import org.apache.tajo.plan.logical.LogicalNode; import org.apache.tajo.plan.logical.NodeType; @@ -58,7 +59,11 @@ public void visit(Stack stack, ExecutionBlockId executionBlock // In the case of cross join, this execution block must be executed with broadcast join. // if (block.getBroadcastRelations().size() == 0 || block.getNonBroadcastRelNum() > 1) { - + String[] relNames = new String[block.getScanNodes().length]; + for (int i = 0; i < relNames.length; i++) { + relNames[i] = block.getScanNodes()[i].getCanonicalName(); + } + state.addVerification(new TooLargeInputForCrossJoinException(new String[]{})); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java index d28b7f62a1..0808ade614 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java @@ -70,7 +70,11 @@ public Tuple next() throws IOException { leftTupleSlots.add(t); } leftIterator = leftTupleSlots.iterator(); - leftTuple = leftIterator.next(); + if (leftIterator.hasNext()) { + leftTuple = leftIterator.next(); + } else { + return null; + } } if (rightTupleSlots.isEmpty()) { diff --git a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java index f1f1e3e6d7..aa4203b4d7 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java @@ -35,6 +35,7 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.conf.TajoConf; +import org.apache.tajo.conf.TajoConf.ConfVars; import org.apache.tajo.engine.parser.SQLAnalyzer; import org.apache.tajo.exception.SQLSyntaxError; import org.apache.tajo.engine.query.QueryContext; @@ -54,10 +55,8 @@ import org.apache.tajo.plan.logical.LogicalRootNode; import org.apache.tajo.plan.logical.NodeType; import org.apache.tajo.plan.util.PlannerUtil; -import org.apache.tajo.plan.verifier.LogicalPlanVerifier; -import org.apache.tajo.plan.verifier.PreLogicalPlanVerifier; -import org.apache.tajo.plan.verifier.SyntaxErrorUtil; -import org.apache.tajo.plan.verifier.VerificationState; +import org.apache.tajo.plan.verifier.*; +import org.apache.tajo.plan.verifier.PostLogicalPlanVerifier.VerifyContext; import org.apache.tajo.session.Session; import org.apache.tajo.storage.TablespaceManager; import org.apache.tajo.util.CommonTestingUtil; @@ -80,6 +79,7 @@ public class GlobalEngine extends AbstractService { private LogicalPlanner planner; private LogicalOptimizer optimizer; private LogicalPlanVerifier annotatedPlanVerifier; + private PostLogicalPlanVerifier postLogicalPlanVerifier; private QueryExecutor queryExecutor; private DDLExecutor ddlExecutor; @@ -101,6 +101,7 @@ public void start() { // Access path rewriter is enabled only in QueryMasterTask optimizer = new LogicalOptimizer(context.getConf(), context.getCatalog()); annotatedPlanVerifier = new LogicalPlanVerifier(); + postLogicalPlanVerifier = new PostLogicalPlanVerifier(); } catch (Throwable t) { LOG.error(t.getMessage(), t); throw new RuntimeException(t); @@ -264,8 +265,6 @@ private LogicalPlan createLogicalPlan(QueryContext queryContext, Expr expression VerificationState state = new VerificationState(); preVerifier.verify(queryContext, state, expression); if (!state.verified()) { - StringBuilder sb = new StringBuilder(); - for (Throwable error : state.getErrors()) { throw error; } @@ -292,6 +291,18 @@ private LogicalPlan createLogicalPlan(QueryContext queryContext, Expr expression } } + VerifyContext verifyContext = new VerifyContext( + queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD), + queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD), + queryContext.getLong(SessionVars.CROSS_JOIN_RESULT_THRESHOLD) + ); + postLogicalPlanVerifier.verify(verifyContext, state, plan); + if (!state.verified()) { + for (Throwable error : state.getErrors()) { + throw error; + } + } + return plan; } 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 7f29c2116a..689208a859 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 @@ -50,6 +50,7 @@ import org.apache.tajo.plan.logical.NodeType; import org.apache.tajo.plan.logical.ScanNode; import org.apache.tajo.plan.util.PlannerUtil; +import org.apache.tajo.plan.verifier.VerificationState; import org.apache.tajo.resource.NodeResource; import org.apache.tajo.rpc.*; import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos; @@ -359,9 +360,15 @@ public synchronized void startQuery() { MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan); queryMasterContext.getGlobalPlanner().build(queryContext, masterPlan); - // Checking is required to guarantee that cross join is always executed with broadcast join. - GlobalPlanVerifier verifier = new GlobalPlanVerifier(); - verifier.verify(masterPlan); +// // Checking is required to guarantee that cross join is always executed with broadcast join. +// GlobalPlanVerifier verifier = new GlobalPlanVerifier(); +// VerificationState state = verifier.verify(masterPlan); +// +// if (!state.verified()) { +// for (Throwable error : state.getErrors()) { +// throw error; +// } +// } query = new Query(queryTaskContext, queryId, querySubmitTime, "", queryTaskContext.getEventHandler(), masterPlan); @@ -468,25 +475,27 @@ public long getQuerySubmitTime() { } private void cleanupQuery(final QueryId queryId) { - Set workers = Sets.newHashSet(); - for (Stage stage : getQuery().getStages()) { - workers.addAll(stage.getAssignedWorkerMap().values()); - } + if (getQuery() != null) { + Set workers = Sets.newHashSet(); + for (Stage stage : getQuery().getStages()) { + workers.addAll(stage.getAssignedWorkerMap().values()); + } - LOG.info("Cleanup resources of all workers. Query: " + queryId + ", workers: " + workers.size()); - for (final InetSocketAddress worker : workers) { - queryMasterContext.getEventExecutor().submit(new Runnable() { - @Override - public void run() { - try { - AsyncRpcClient rpc = RpcClientManager.getInstance().getClient(worker, TajoWorkerProtocol.class, true); - TajoWorkerProtocol.TajoWorkerProtocolService tajoWorkerProtocolService = rpc.getStub(); - tajoWorkerProtocolService.stopQuery(null, queryId.getProto(), NullCallback.get()); - } catch (Throwable e) { - LOG.error(e.getMessage(), e); + LOG.info("Cleanup resources of all workers. Query: " + queryId + ", workers: " + workers.size()); + for (final InetSocketAddress worker : workers) { + queryMasterContext.getEventExecutor().submit(new Runnable() { + @Override + public void run() { + try { + AsyncRpcClient rpc = RpcClientManager.getInstance().getClient(worker, TajoWorkerProtocol.class, true); + TajoWorkerProtocol.TajoWorkerProtocolService tajoWorkerProtocolService = rpc.getStub(); + tajoWorkerProtocolService.stopQuery(null, queryId.getProto(), NullCallback.get()); + } catch (Throwable e) { + LOG.error(e.getMessage(), e); + } } - } - }); + }); + } } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.java new file mode 100644 index 0000000000..b537441141 --- /dev/null +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.java @@ -0,0 +1,82 @@ +/** + * 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.plan.util; + +import org.apache.tajo.catalog.SchemaUtil; +import org.apache.tajo.exception.TajoInternalError; +import org.apache.tajo.plan.joinorder.GreedyHeuristicJoinOrderAlgorithm; +import org.apache.tajo.plan.logical.*; + +public class PlanVerifierUtil { + +// public static long estimateOutputVolume(LogicalNode plan) { +// // output volume = output row number * output row width +// return SchemaUtil.estimateRowByteSizeWithSchema(plan.getOutSchema()) +// * estimateOutputRowNum(PlannerUtil.findTopNode(plan, NodeType.JOIN)); +// } + + public static double estimateOutputRowNumForJoin(JoinSpec joinSpec, double leftInputRowNum, double rightInputRowNum) + throws TajoInternalError { + + switch (joinSpec.getType()) { + case CROSS: + return leftInputRowNum * rightInputRowNum; + case INNER: + return (long) (leftInputRowNum * rightInputRowNum * + Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); + case LEFT_OUTER: + return leftInputRowNum; + case RIGHT_OUTER: + return rightInputRowNum; + case FULL_OUTER: + return leftInputRowNum < rightInputRowNum ? leftInputRowNum : rightInputRowNum; + case LEFT_ANTI: + case LEFT_SEMI: + return (long) (leftInputRowNum * + Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); + case RIGHT_ANTI: + case RIGHT_SEMI: + return (long) (rightInputRowNum * + Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); + } + + throw new TajoInternalError("Invalide join type: " + joinSpec.getType()); + } + + /** + * 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; + } + } +} diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java new file mode 100644 index 0000000000..0ea009152f --- /dev/null +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java @@ -0,0 +1,202 @@ +/** + * 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.plan.verifier; + +import org.apache.tajo.algebra.JoinType; +import org.apache.tajo.catalog.SchemaUtil; +import org.apache.tajo.exception.TajoException; +import org.apache.tajo.exception.TooLargeInputForCrossJoinException; +import org.apache.tajo.exception.TooLargeResultForCrossJoinException; +import org.apache.tajo.plan.LogicalPlan; +import org.apache.tajo.plan.joinorder.GreedyHeuristicJoinOrderAlgorithm; +import org.apache.tajo.plan.logical.*; +import org.apache.tajo.plan.util.PlanVerifierUtil; +import org.apache.tajo.plan.verifier.PostLogicalPlanVerifier.InputContext; +import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor; +import org.apache.tajo.util.TUtil; + +import java.util.Set; +import java.util.Stack; + +public class PostLogicalPlanVerifier extends BasicLogicalPlanVisitor { + + public static class VerifyContext { + private long broadcastThresholdForNonCrossJoin; + private long broadcastThresholdForCrossJoin; + private long crossJoinResultThreshold; + + public VerifyContext(long broadcastThresholdForNonCrossJoin, + long broadcastThresholdForCrossJoin, + long crossJoinResultThreshold) { + this.broadcastThresholdForNonCrossJoin = broadcastThresholdForNonCrossJoin; + this.broadcastThresholdForCrossJoin = broadcastThresholdForCrossJoin; + this.crossJoinResultThreshold = crossJoinResultThreshold; + } + } + + static class InputContext { + VerifyContext verifyContext; + VerificationState state; + double estimatedResultSize; + double estimatedRowNum; + Set nonBroadcastableRelations = TUtil.newHashSet(); + + public InputContext(VerificationState state) { + this.state = state; + } + } + + public VerificationState verify(VerifyContext verifyContext, VerificationState state, LogicalPlan plan) + throws TajoException { + InputContext context = new InputContext(state); + context.verifyContext = verifyContext; + visit(context, plan, plan.getRootBlock()); + return context.state; + } + + @Override + public Object visitJoin(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, JoinNode node, + Stack stack) throws TajoException { + stack.push(node); + visit(context, plan, block, node.getLeftChild(), stack); + double estimatedLeftResultSize = context.estimatedResultSize; + double estimatedLeftRowNum = context.estimatedRowNum; + visit(context, plan, block, node.getRightChild(), stack); + stack.pop(); + + context.estimatedRowNum = PlanVerifierUtil.estimateOutputRowNumForJoin(node.getJoinSpec(), + estimatedLeftRowNum, context.estimatedRowNum); + context.estimatedResultSize = context.estimatedRowNum * + SchemaUtil.estimateRowByteSizeWithSchema(node.getOutSchema()); + + if (node.getJoinType() == JoinType.CROSS) { + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Cross join is one of the most heavy operations. To avoid the trouble caused by exhausting resources to perform + // cross join, we allow it only when it does not burden cluster too much. + // + // If the join type is cross, the following two restrictions are checked. + // 1) The expected result size does not exceed the predefined threshold. + // 2) Cross join must be executed with broadcast join. + // + // For the second restriction, the following two conditions must be satisfied. + // 1) There is at most a single relation which size is greater than the broadcast join threshold for non-cross + // join. + // 2) At least one of the cross join's inputs must not exceed the broadcast join threshold for cross join. + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + if (estimatedLeftResultSize > context.verifyContext.broadcastThresholdForCrossJoin && + context.estimatedResultSize > context.verifyContext.broadcastThresholdForCrossJoin) { + context.state.addVerification(new TooLargeInputForCrossJoinException( + context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]) + )); + } + + if (context.nonBroadcastableRelations.size() > 1) { + context.state.addVerification(new TooLargeInputForCrossJoinException( + context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]) + )); + } + + if (context.verifyContext.crossJoinResultThreshold < context.estimatedResultSize) { + context.state.addVerification(new TooLargeResultForCrossJoinException()); + } + + } + return null; + } + + @Override + public Object visitProjection(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, ProjectionNode node, + Stack stack) throws TajoException { + super.visitProjection(context, plan, block, node, stack); + context.estimatedResultSize *= (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getOutSchema()) / + (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getInSchema()); + return null; + } + + @Override + public Object visitLimit(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, LimitNode node, + Stack stack) throws TajoException { + super.visitLimit(context, plan, block, node, stack); + context.estimatedRowNum = node.getFetchFirstNum(); + context.estimatedResultSize = node.getFetchFirstNum() * + SchemaUtil.estimateRowByteSizeWithSchema(node.getOutSchema()); + return null; + } + + @Override + public Object visitFilter(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, SelectionNode node, + Stack stack) throws TajoException { + super.visitFilter(context, plan, block, node, stack); + context.estimatedResultSize *= GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR; + context.estimatedRowNum *= GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR; + return null; + } + + @Override + public Object visitUnion(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, UnionNode node, + Stack stack) throws TajoException { + stack.push(node); + if (plan != null) { + LogicalPlan.QueryBlock leftBlock = plan.getBlock(node.getLeftChild()); + visit(context, plan, leftBlock, leftBlock.getRoot(), stack); + double estimatedLeftResultSize = context.estimatedResultSize; + double estimatedLeftRowNum = context.estimatedRowNum; + LogicalPlan.QueryBlock rightBlock = plan.getBlock(node.getRightChild()); + visit(context, plan, rightBlock, rightBlock.getRoot(), stack); + context.estimatedResultSize += estimatedLeftResultSize; + context.estimatedRowNum += estimatedLeftRowNum; + } else { + visit(context, null, null, node.getLeftChild(), stack); + double estimatedLeftResultSize = context.estimatedResultSize; + double estimatedLeftRowNum = context.estimatedRowNum; + visit(context, null, null, node.getRightChild(), stack); + context.estimatedResultSize += estimatedLeftResultSize; + context.estimatedRowNum += estimatedLeftRowNum; + } + + stack.pop(); + return null; + } + + @Override + public Object visitScan(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, ScanNode node, + Stack stack) throws TajoException { + context.estimatedResultSize = PlanVerifierUtil.getTableVolume(node); + context.estimatedRowNum = context.estimatedResultSize / + (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getTableDesc().getLogicalSchema()); + if (context.estimatedResultSize > context.verifyContext.broadcastThresholdForNonCrossJoin) { + context.nonBroadcastableRelations.add(node.getTableDesc().getName()); + } + return null; + } + + @Override + public Object visitPartitionedTableScan(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, + PartitionedTableScanNode node, Stack stack) + throws TajoException { + context.estimatedResultSize = PlanVerifierUtil.getTableVolume(node); + context.estimatedRowNum = context.estimatedResultSize / + (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getTableDesc().getLogicalSchema()); + if (context.estimatedResultSize > context.verifyContext.broadcastThresholdForNonCrossJoin) { + context.nonBroadcastableRelations.add(node.getTableDesc().getName()); + } + return null; + } +} From 5014b05277d9b79515fcff2d7253ad2eec2d650f Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Thu, 20 Aug 2015 10:35:47 +0900 Subject: [PATCH 07/18] improve error message --- .../src/main/java/org/apache/tajo/conf/TajoConf.java | 2 +- .../java/org/apache/tajo/exception/ErrorMessages.java | 10 ++++++---- .../java/org/apache/tajo/exception/ExceptionUtil.java | 3 +++ .../exception/TooLargeInputForCrossJoinException.java | 4 ++-- .../exception/TooLargeResultForCrossJoinException.java | 4 ++-- .../planner/global/verifier/GlobalPlanVerifier.java | 2 +- .../tajo/plan/verifier/PostLogicalPlanVerifier.java | 9 ++++++--- 7 files changed, 21 insertions(+), 13 deletions(-) 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 aacaa5d965..d2d76fb7a4 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 @@ -314,7 +314,7 @@ public static enum ConfVars implements ConfigKey { (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_CROSS_JOIN_RESULT_THRESHOLD("tajo.dist-query.cross-join.result.threshold-mb", 1024), // 1 GB + $DIST_QUERY_CROSS_JOIN_RESULT_THRESHOLD("tajo.dist-query.cross-join.result.threshold-bytes", 1024 * 1048576), // 1 GB $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), 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 11aff1faeb..4fb0e7b03d 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 @@ -109,10 +109,12 @@ 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 tajo.dist-query.broadcast.cross-join.threshold-bytes.", 1); - ADD_MESSAGE(TOO_LARGE_RESULT_FOR_CROSS_JOIN, "Estimated size of cross join is too large."); + 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(TOO_LARGE_RESULT_FOR_CROSS_JOIN, "Estimated size of cross join is too large." + + "To execute cross join, please increase CROSS_JOIN_RESULT_THRESHOLD " + + "which is currently set to %s.", 1); 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); 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 71dcfc4211..02835e5320 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(UNSUPPORTED_DATATYPE, UnsupportedDataTypeException.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(TOO_LARGE_RESULT_FOR_CROSS_JOIN, TooLargeResultForCrossJoinException.class); } private static void ADD_EXCEPTION(Errors.ResultCode code, Class cls) { 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 index ec52e09586..4a8f5e76d8 100644 --- a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java +++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java @@ -28,7 +28,7 @@ public TooLargeInputForCrossJoinException(ReturnState e) { super(e); } - public TooLargeInputForCrossJoinException(String[] relations) { - super(ResultCode.TOO_LARGE_INPUT_FOR_CROSS_JOIN, StringUtils.join(relations)); + public TooLargeInputForCrossJoinException(String[] relations, long currentThreshold) { + super(ResultCode.TOO_LARGE_INPUT_FOR_CROSS_JOIN, StringUtils.join(relations), "" + currentThreshold); } } diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java index e407344ebf..f390c21c11 100644 --- a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java +++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java @@ -9,7 +9,7 @@ public TooLargeResultForCrossJoinException(ReturnState e) { super(e); } - public TooLargeResultForCrossJoinException() { - super(ResultCode.TOO_LARGE_RESULT_FOR_CROSS_JOIN); + public TooLargeResultForCrossJoinException(long currentThreshold) { + super(ResultCode.TOO_LARGE_RESULT_FOR_CROSS_JOIN, currentThreshold + ""); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java index 05e46b8fd9..37524e39fb 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java @@ -63,7 +63,7 @@ public void visit(Stack stack, ExecutionBlockId executionBlock for (int i = 0; i < relNames.length; i++) { relNames[i] = block.getScanNodes()[i].getCanonicalName(); } - state.addVerification(new TooLargeInputForCrossJoinException(new String[]{})); + state.addVerification(new TooLargeInputForCrossJoinException(new String[]{}, 0)); } } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java index 0ea009152f..04b2c67de6 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java @@ -103,18 +103,21 @@ public Object visitJoin(InputContext context, LogicalPlan plan, LogicalPlan.Quer if (estimatedLeftResultSize > context.verifyContext.broadcastThresholdForCrossJoin && context.estimatedResultSize > context.verifyContext.broadcastThresholdForCrossJoin) { context.state.addVerification(new TooLargeInputForCrossJoinException( - context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]) + context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]), + context.verifyContext.broadcastThresholdForCrossJoin )); } if (context.nonBroadcastableRelations.size() > 1) { context.state.addVerification(new TooLargeInputForCrossJoinException( - context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]) + context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]), + context.verifyContext.broadcastThresholdForCrossJoin )); } if (context.verifyContext.crossJoinResultThreshold < context.estimatedResultSize) { - context.state.addVerification(new TooLargeResultForCrossJoinException()); + context.state.addVerification( + new TooLargeResultForCrossJoinException(context.verifyContext.crossJoinResultThreshold)); } } From ccc6eba2f445f2b813322b4fb806b829bd0f3753 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Thu, 20 Aug 2015 17:47:19 +0900 Subject: [PATCH 08/18] Remove estimation code --- .../org/apache/tajo/catalog/SchemaUtil.java | 8 +- .../apache/tajo/exception/ErrorMessages.java | 4 +- .../apache/tajo/exception/ExceptionUtil.java | 1 + .../exception/InvalidInputsForCrossJoin.java | 19 ++ .../TooLargeInputForCrossJoinException.java | 8 +- .../TooLargeResultForCrossJoinException.java | 18 ++ tajo-common/src/main/proto/errors.proto | 3 +- .../tajo/engine/query/TestCrossJoin.java | 96 ++++++++ .../tajo/engine/query/TestInnerJoinQuery.java | 5 - .../engine/query/TestMultipleJoinTypes.java | 15 -- .../rewriter/rules/BroadcastJoinRule.java | 41 ++-- .../global/verifier/GlobalPlanVerifier.java | 71 ------ .../org/apache/tajo/master/GlobalEngine.java | 15 +- .../tajo/master/QueryCoordinatorService.java | 6 +- .../apache/tajo/master/QueryInProgress.java | 7 +- .../apache/tajo/querymaster/QueryMaster.java | 6 + .../tajo/querymaster/QueryMasterTask.java | 17 +- tajo-core/src/main/proto/ResourceProtos.proto | 4 +- .../GreedyHeuristicJoinOrderAlgorithm.java | 20 +- .../tajo/plan/util/PlanVerifierUtil.java | 82 ------- .../verifier/PostLogicalPlanVerifier.java | 205 +++++++----------- 21 files changed, 269 insertions(+), 382 deletions(-) create mode 100644 tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java create mode 100644 tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCrossJoin.java delete mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java delete mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.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 09a2e456a2..4a8e419d2b 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 @@ 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 static int getColByteSize(Column col) { case BOOLEAN: return 1; case CHAR: - return 1; + return col.getDataType().getLength(); case BIT: return 1; case INT2: @@ -242,7 +244,7 @@ public static int getColByteSize(Column col) { case INET4: return 4; case INET6: - return 32; + return 16; case TEXT: return 256; case BLOB: @@ -254,7 +256,7 @@ public static int getColByteSize(Column col) { case TIMESTAMP: return 8; default: - return 0; + throw new TajoRuntimeException(new UnsupportedDataTypeException(col.getDataType().toString())); } } } 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 4fb0e7b03d..ac2b0bec9a 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 @@ -109,12 +109,14 @@ 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" + + 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(TOO_LARGE_RESULT_FOR_CROSS_JOIN, "Estimated size of cross join is too large." + "To execute cross join, please increase CROSS_JOIN_RESULT_THRESHOLD " + "which is currently set to %s.", 1); + 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); 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 02835e5320..f9da5473a9 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 @@ -83,6 +83,7 @@ public class ExceptionUtil { ADD_EXCEPTION(TOO_LARGE_INPUT_FOR_CROSS_JOIN, TooLargeInputForCrossJoinException.class); ADD_EXCEPTION(TOO_LARGE_RESULT_FOR_CROSS_JOIN, TooLargeResultForCrossJoinException.class); + ADD_EXCEPTION(INVALID_INPUTS_FOR_CROSS_JOIN, InvalidInputsForCrossJoin.class); } private static void ADD_EXCEPTION(Errors.ResultCode code, Class cls) { 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 0000000000..0a13a0d069 --- /dev/null +++ b/tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java @@ -0,0 +1,19 @@ +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); + } +} 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 index 4a8f5e76d8..32cd44e3f4 100644 --- a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java +++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeInputForCrossJoinException.java @@ -22,13 +22,17 @@ 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 currentThreshold) { - super(ResultCode.TOO_LARGE_INPUT_FOR_CROSS_JOIN, StringUtils.join(relations), "" + currentThreshold); + public TooLargeInputForCrossJoinException(String[] relations, long currentBroadcastThreshold) { + super(ResultCode.TOO_LARGE_INPUT_FOR_CROSS_JOIN, StringUtils.join(relations), "" + currentBroadcastThreshold); } } diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java index f390c21c11..90bca465d2 100644 --- a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java +++ b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java @@ -1,3 +1,21 @@ +/** + * 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; diff --git a/tajo-common/src/main/proto/errors.proto b/tajo-common/src/main/proto/errors.proto index 488f60d144..53b8b6d3d2 100644 --- a/tajo-common/src/main/proto/errors.proto +++ b/tajo-common/src/main/proto/errors.proto @@ -183,8 +183,9 @@ enum ResultCode { STRING_CONSTANT_TOOL_LONG = 54002; TOO_LARGE_INPUT_FOR_CROSS_JOIN = 54003; TOO_LARGE_RESULT_FOR_CROSS_JOIN = 54004; + INVALID_INPUTS_FOR_CROSS_JOIN = 54005; - TOO_MANY_TABLES = 54005; + TOO_MANY_TABLES = 54006; TOO_MANY_COLUMNS = 54011; TOO_MANY_ARGUMENTS = 54023; 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 0000000000..cfa54ada0f --- /dev/null +++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCrossJoin.java @@ -0,0 +1,96 @@ +/** + * 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 (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(withExplainGlobal = true, parameterized = true) + @SimpleTest (queries = { + @QuerySpec("select * from nation cross join region") + }) + public final void testCrossJoinOfOneSmallTable() throws Exception { + runSimpleTests(); + } + + @Test + @Option(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(withExplainGlobal = true, parameterized = true) + @SimpleTest (queries = { + @QuerySpec("select * from lineitem cross join region") + }) + public final void testCrossJoinOftwoSmallTables() throws Exception { + runSimpleTests(); + } +} 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 4328e8e0b8..88b35487e1 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 @@ -63,11 +63,6 @@ public final void testCrossJoin() throws Exception { runSimpleTests(); } - @Test - public final void testCrossJoin2() throws Exception { - executeString("select * from nation n1, nation n2"); - } - @Test @Option(withExplain = true, withExplainGlobal = true, parameterized = true, sort = true) @SimpleTest() diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java index b11bbd8b3e..d3cde3dfd5 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestMultipleJoinTypes.java @@ -103,19 +103,4 @@ public void testComplexJoinsWithCaseWhen2() throws Exception { public final void testInnerAndOuterWithEmpty() throws Exception { runSimpleTests(); } - - @Test - public final void testCrossAndNonCross() 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 - public final void testCrossAndNonCross2() throws Exception { - executeString("select * from region full outer join lineitem on r_regionkey = l_orderkey full outer join supplier on s_suppkey = l_suppkey cross join nation"); - } - - @Test - public final void testCrossAndNonCross3() throws Exception { - executeString("select * from nation n1 cross join nation n2"); - } } 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 index 92691bc351..41a3af7626 100644 --- 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 @@ -22,7 +22,6 @@ import org.apache.tajo.OverridableConf; import org.apache.tajo.SessionVars; import org.apache.tajo.algebra.JoinType; -import org.apache.tajo.catalog.SchemaUtil; import org.apache.tajo.engine.planner.global.ExecutionBlock; import org.apache.tajo.engine.planner.global.GlobalPlanner; import org.apache.tajo.engine.planner.global.MasterPlan; @@ -267,15 +266,14 @@ private void updateBroadcastableRelForChildEb(ExecutionBlock child, JoinType joi } private long estimateOutputVolume(ExecutionBlock block) { - // output volume = output row number * output row width - return SchemaUtil.estimateRowByteSizeWithSchema(block.getPlan().getOutSchema()) - * estimateOutputRowNum(PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN)); + return estimateOutputVolumeInternal(PlannerUtil.findTopNode(block.getPlan(), NodeType.JOIN)); } - private long estimateOutputRowNum(LogicalNode node) throws TajoInternalError { + private long estimateOutputVolumeInternal(LogicalNode node) throws TajoInternalError { if (node instanceof RelationNode) { switch (node.getType()) { + case INDEX_SCAN: case SCAN: ScanNode scanNode = (ScanNode) node; if (scanNode.getTableDesc().getStats() == null) { @@ -283,8 +281,7 @@ private long estimateOutputRowNum(LogicalNode node) throws TajoInternalError { // broadcast method. return Long.MAX_VALUE; } else { - return scanNode.getTableDesc().getStats().getNumBytes() / - SchemaUtil.estimateRowByteSizeWithSchema(scanNode.getTableDesc().getSchema()); + return scanNode.getTableDesc().getStats().getNumBytes(); } case PARTITIONS_SCAN: PartitionedTableScanNode pScanNode = (PartitionedTableScanNode) node; @@ -297,44 +294,42 @@ private long estimateOutputRowNum(LogicalNode node) throws TajoInternalError { if (pScanNode.getInputPaths() == null || pScanNode.getInputPaths().length == 0) { return 0; } else { - return pScanNode.getTableDesc().getStats().getNumBytes() / - SchemaUtil.estimateRowByteSizeWithSchema(pScanNode.getTableDesc().getLogicalSchema()); + return pScanNode.getTableDesc().getStats().getNumBytes(); } } case TABLE_SUBQUERY: - return estimateOutputRowNum(((TableSubQueryNode) node).getSubQuery()); - default: - throw new IllegalArgumentException("Not RelationNode"); + return estimateOutputVolumeInternal(((TableSubQueryNode) node).getSubQuery()); } } else if (node instanceof UnaryNode) { - return estimateOutputRowNum(((UnaryNode) node).getChild()); + return estimateOutputVolumeInternal(((UnaryNode) node).getChild()); } else if (node instanceof UnionNode) { UnionNode binaryNode = (UnionNode) node; - return estimateOutputRowNum(binaryNode.getLeftChild()) + estimateOutputRowNum(binaryNode.getRightChild()); + return estimateOutputVolumeInternal(binaryNode.getLeftChild()) + + estimateOutputVolumeInternal(binaryNode.getRightChild()); } else if (node instanceof JoinNode) { JoinNode joinNode = (JoinNode) node; JoinSpec joinSpec = joinNode.getJoinSpec(); - long leftChildRowNum = estimateOutputRowNum(joinNode.getLeftChild()); - long rightChildRownum = estimateOutputRowNum(joinNode.getRightChild()); + long leftChildVolume = estimateOutputVolumeInternal(joinNode.getLeftChild()); + long rightChildVolume = estimateOutputVolumeInternal(joinNode.getRightChild()); switch (joinNode.getJoinType()) { case CROSS: - return leftChildRowNum * rightChildRownum; + return leftChildVolume * rightChildVolume; case INNER: - return (long) (leftChildRowNum * rightChildRownum * + return (long) (leftChildVolume * rightChildVolume * Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); case LEFT_OUTER: - return leftChildRowNum; + return leftChildVolume; case RIGHT_OUTER: - return rightChildRownum; + return rightChildVolume; case FULL_OUTER: - return leftChildRowNum < rightChildRownum ? leftChildRowNum : rightChildRownum; + return leftChildVolume < rightChildVolume ? leftChildVolume : rightChildVolume; case LEFT_ANTI: case LEFT_SEMI: - return (long) (leftChildRowNum * + return (long) (leftChildVolume * Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); case RIGHT_ANTI: case RIGHT_SEMI: - return (long) (rightChildRownum * + return (long) (rightChildVolume * Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java deleted file mode 100644 index 37524e39fb..0000000000 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/verifier/GlobalPlanVerifier.java +++ /dev/null @@ -1,71 +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.global.verifier; - -import org.apache.tajo.ExecutionBlockId; -import org.apache.tajo.algebra.JoinType; -import org.apache.tajo.engine.planner.global.ExecutionBlock; -import org.apache.tajo.engine.planner.global.MasterPlan; -import org.apache.tajo.exception.TooLargeInputForCrossJoinException; -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.plan.verifier.VerificationState; -import org.apache.tajo.util.graph.DirectedGraphVisitor; - -import java.util.Stack; - -public class GlobalPlanVerifier implements DirectedGraphVisitor { - private MasterPlan plan; - private VerificationState state; - - public VerificationState verify(MasterPlan plan) { - this.plan = plan; - this.state = new VerificationState(); - plan.accept(plan.getRoot().getId(), this); - return state; - } - - @Override - public void visit(Stack stack, ExecutionBlockId executionBlockId) { - ExecutionBlock block = plan.getExecBlock(executionBlockId); - if (block.hasJoin()) { - LogicalNode[] joinNodes = PlannerUtil.findAllNodes(block.getPlan(), NodeType.JOIN); - boolean containCrossJoin = false; - for (LogicalNode eachNode : joinNodes) { - if (((JoinNode)eachNode).getJoinType() == JoinType.CROSS) { - containCrossJoin = true; - break; - } - } - if (containCrossJoin) { - // In the case of cross join, this execution block must be executed with broadcast join. - // - if (block.getBroadcastRelations().size() == 0 || block.getNonBroadcastRelNum() > 1) { - String[] relNames = new String[block.getScanNodes().length]; - for (int i = 0; i < relNames.length; i++) { - relNames[i] = block.getScanNodes()[i].getCanonicalName(); - } - state.addVerification(new TooLargeInputForCrossJoinException(new String[]{}, 0)); - } - } - } - } -} diff --git a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java index aa4203b4d7..cd1ab5021d 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java @@ -35,14 +35,9 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.conf.TajoConf.ConfVars; import org.apache.tajo.engine.parser.SQLAnalyzer; -import org.apache.tajo.exception.SQLSyntaxError; import org.apache.tajo.engine.query.QueryContext; -import org.apache.tajo.exception.ExceptionUtil; -import org.apache.tajo.exception.ReturnStateUtil; -import org.apache.tajo.exception.TajoException; -import org.apache.tajo.exception.TajoRuntimeException; +import org.apache.tajo.exception.*; import org.apache.tajo.master.TajoMaster.MasterContext; import org.apache.tajo.master.exec.DDLExecutor; import org.apache.tajo.master.exec.QueryExecutor; @@ -56,7 +51,6 @@ import org.apache.tajo.plan.logical.NodeType; import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.plan.verifier.*; -import org.apache.tajo.plan.verifier.PostLogicalPlanVerifier.VerifyContext; import org.apache.tajo.session.Session; import org.apache.tajo.storage.TablespaceManager; import org.apache.tajo.util.CommonTestingUtil; @@ -291,12 +285,7 @@ private LogicalPlan createLogicalPlan(QueryContext queryContext, Expr expression } } - VerifyContext verifyContext = new VerifyContext( - queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD), - queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD), - queryContext.getLong(SessionVars.CROSS_JOIN_RESULT_THRESHOLD) - ); - postLogicalPlanVerifier.verify(verifyContext, state, plan); + postLogicalPlanVerifier.verify(queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD), state, plan); if (!state.verified()) { for (Throwable error : state.getErrors()) { throw error; diff --git a/tajo-core/src/main/java/org/apache/tajo/master/QueryCoordinatorService.java b/tajo-core/src/main/java/org/apache/tajo/master/QueryCoordinatorService.java index fc7e0e36c1..e209538c9a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/QueryCoordinatorService.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/QueryCoordinatorService.java @@ -26,15 +26,13 @@ import org.apache.hadoop.yarn.event.Dispatcher; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.ipc.QueryCoordinatorProtocol; -import org.apache.tajo.ipc.QueryCoordinatorProtocol.*; +import org.apache.tajo.ipc.QueryCoordinatorProtocol.QueryCoordinatorProtocolService; import org.apache.tajo.master.cluster.WorkerConnectionInfo; import org.apache.tajo.master.rm.NodeStatus; import org.apache.tajo.master.scheduler.event.ResourceReserveSchedulerEvent; import org.apache.tajo.rpc.AsyncRpcServer; import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos; -import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.BoolProto; import org.apache.tajo.util.NetUtils; -import org.apache.tajo.util.ProtoUtil; import java.net.InetSocketAddress; import java.util.Collection; @@ -128,7 +126,7 @@ public void reserveNodeResources(RpcController controller, NodeResourceRequest r */ @Override public void getAllWorkers(RpcController controller, PrimitiveProtos.NullProto request, - RpcCallback done) { + RpcCallback done) { WorkerConnectionsResponse.Builder builder = WorkerConnectionsResponse.newBuilder(); Collection nodeStatuses = context.getResourceManager().getRMContext().getNodes().values(); diff --git a/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java b/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java index e22663a11b..b8488768ea 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java @@ -25,6 +25,7 @@ import org.apache.tajo.ResourceProtos.AllocationResourceProto; import org.apache.tajo.ResourceProtos.QueryExecutionRequest; import org.apache.tajo.TajoProtos; +import org.apache.tajo.TajoProtos.QueryState; import org.apache.tajo.engine.query.QueryContext; import org.apache.tajo.ipc.QueryMasterProtocol; import org.apache.tajo.ipc.QueryMasterProtocol.QueryMasterProtocolService; @@ -259,12 +260,12 @@ public void heartbeat(QueryInfo queryInfo) { // Update diagnosis message if (queryInfo.getLastMessage() != null && !queryInfo.getLastMessage().isEmpty()) { this.queryInfo.setLastMessage(queryInfo.getLastMessage()); - LOG.info(queryId + queryInfo.getLastMessage()); } // if any error occurs, print outs the error message - if (this.queryInfo.getQueryState() == TajoProtos.QueryState.QUERY_FAILED) { - LOG.warn(queryId + " failed, " + queryInfo.getLastMessage()); + if (this.queryInfo.getQueryState() == QueryState.QUERY_FAILED || + this.queryInfo.getQueryState() == QueryState.QUERY_ERROR) { + LOG.warn(queryId + " is stopped because " + queryInfo.getLastMessage()); } // terminal state will let client to retrieve a query result diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMaster.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMaster.java index c471aea4ea..a029802968 100644 --- a/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMaster.java +++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMaster.java @@ -35,6 +35,8 @@ import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.planner.global.GlobalPlanner; import org.apache.tajo.engine.query.QueryContext; +import org.apache.tajo.error.Errors.ResultCode; +import org.apache.tajo.exception.ReturnStateUtil; import org.apache.tajo.ipc.QueryCoordinatorProtocol; import org.apache.tajo.ipc.QueryCoordinatorProtocol.QueryCoordinatorProtocolService; import org.apache.tajo.ResourceProtos.TajoHeartbeatRequest; @@ -44,6 +46,7 @@ import org.apache.tajo.master.event.QueryStopEvent; import org.apache.tajo.rpc.*; import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos; +import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState; import org.apache.tajo.service.ServiceTracker; import org.apache.tajo.util.TUtil; import org.apache.tajo.util.history.HistoryReader; @@ -344,6 +347,9 @@ private TajoHeartbeatRequest buildTajoHeartBeat(QueryMasterTask queryMasterTask) } builder.setQueryProgress(queryMasterTask.getQuery().getProgress()); } + if (queryMasterTask.isInitError()) { + builder.setStatusMessage(ReturnStateUtil.returnError(queryMasterTask.getInitError()).getMessage()); + } return builder.build(); } 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 689208a859..2f5917c4b6 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 @@ -36,9 +36,7 @@ import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.planner.global.MasterPlan; -import org.apache.tajo.engine.planner.global.verifier.GlobalPlanVerifier; import org.apache.tajo.engine.query.QueryContext; -import org.apache.tajo.exception.TajoException; import org.apache.tajo.ipc.TajoWorkerProtocol; import org.apache.tajo.master.cluster.WorkerConnectionInfo; import org.apache.tajo.master.event.*; @@ -50,7 +48,6 @@ import org.apache.tajo.plan.logical.NodeType; import org.apache.tajo.plan.logical.ScanNode; import org.apache.tajo.plan.util.PlannerUtil; -import org.apache.tajo.plan.verifier.VerificationState; import org.apache.tajo.resource.NodeResource; import org.apache.tajo.rpc.*; import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos; @@ -59,8 +56,6 @@ import org.apache.tajo.storage.Tablespace; import org.apache.tajo.storage.TablespaceManager; import org.apache.tajo.util.TUtil; -import org.apache.tajo.util.metrics.TajoMetrics; -import org.apache.tajo.util.metrics.reporter.MetricsConsoleReporter; import org.apache.tajo.worker.event.NodeResourceDeallocateEvent; import org.apache.tajo.worker.event.NodeResourceEvent; import org.apache.tajo.worker.event.NodeStatusEvent; @@ -72,8 +67,8 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; +import static org.apache.tajo.ResourceProtos.TaskFatalErrorReport; import static org.apache.tajo.TajoProtos.QueryState; -import static org.apache.tajo.ResourceProtos.*; public class QueryMasterTask extends CompositeService { private static final Log LOG = LogFactory.getLog(QueryMasterTask.class.getName()); @@ -360,16 +355,6 @@ public synchronized void startQuery() { MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan); queryMasterContext.getGlobalPlanner().build(queryContext, masterPlan); -// // Checking is required to guarantee that cross join is always executed with broadcast join. -// GlobalPlanVerifier verifier = new GlobalPlanVerifier(); -// VerificationState state = verifier.verify(masterPlan); -// -// if (!state.verified()) { -// for (Throwable error : state.getErrors()) { -// throw error; -// } -// } - query = new Query(queryTaskContext, queryId, querySubmitTime, "", queryTaskContext.getEventHandler(), masterPlan); diff --git a/tajo-core/src/main/proto/ResourceProtos.proto b/tajo-core/src/main/proto/ResourceProtos.proto index e789b81ed0..a24c8408ea 100644 --- a/tajo-core/src/main/proto/ResourceProtos.proto +++ b/tajo-core/src/main/proto/ResourceProtos.proto @@ -208,7 +208,7 @@ message NodeHeartbeatResponse { repeated QueryIdProto queryId = 3; } -//deplecated +// deprecated message TajoHeartbeatRequest { required WorkerConnectionInfoProto connectionInfo = 1; optional QueryIdProto queryId = 2; @@ -218,7 +218,7 @@ message TajoHeartbeatRequest { optional float queryProgress = 6; } -//deplecated +// deprecated message TajoHeartbeatResponse { message ResponseCommand { required string command = 1; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java index 79840244c5..774e778f1f 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java @@ -367,23 +367,23 @@ public static double getCost(JoinEdge joinEdge) { // TODO - improve cost estimation // for outer joins, filter factor does not matter case LEFT_OUTER: - factor *= SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / - SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()); + factor *= (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / + (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()); break; case RIGHT_OUTER: - factor *= SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / - SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getRightVertex().getSchema()); + factor *= (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / + (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getRightVertex().getSchema()); break; case FULL_OUTER: - factor *= Math.max(SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / - SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()), - SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / - SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getRightVertex().getSchema())); + factor *= Math.max((float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / + (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()), + (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / + (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getRightVertex().getSchema())); break; case LEFT_ANTI: case LEFT_SEMI: factor *= DEFAULT_SELECTION_FACTOR * SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) / - SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()); + (float)SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()); break; case INNER: default: @@ -391,7 +391,7 @@ public static double getCost(JoinEdge joinEdge) { // filter factor * output tuple width / input tuple width factor *= Math.pow(DEFAULT_SELECTION_FACTOR, joinEdge.getJoinQual().size()) * SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getSchema()) - / (SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()) + / (float)(SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getLeftVertex().getSchema()) + SchemaUtil.estimateRowByteSizeWithSchema(joinEdge.getRightVertex().getSchema())); break; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.java deleted file mode 100644 index b537441141..0000000000 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlanVerifierUtil.java +++ /dev/null @@ -1,82 +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.plan.util; - -import org.apache.tajo.catalog.SchemaUtil; -import org.apache.tajo.exception.TajoInternalError; -import org.apache.tajo.plan.joinorder.GreedyHeuristicJoinOrderAlgorithm; -import org.apache.tajo.plan.logical.*; - -public class PlanVerifierUtil { - -// public static long estimateOutputVolume(LogicalNode plan) { -// // output volume = output row number * output row width -// return SchemaUtil.estimateRowByteSizeWithSchema(plan.getOutSchema()) -// * estimateOutputRowNum(PlannerUtil.findTopNode(plan, NodeType.JOIN)); -// } - - public static double estimateOutputRowNumForJoin(JoinSpec joinSpec, double leftInputRowNum, double rightInputRowNum) - throws TajoInternalError { - - switch (joinSpec.getType()) { - case CROSS: - return leftInputRowNum * rightInputRowNum; - case INNER: - return (long) (leftInputRowNum * rightInputRowNum * - Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); - case LEFT_OUTER: - return leftInputRowNum; - case RIGHT_OUTER: - return rightInputRowNum; - case FULL_OUTER: - return leftInputRowNum < rightInputRowNum ? leftInputRowNum : rightInputRowNum; - case LEFT_ANTI: - case LEFT_SEMI: - return (long) (leftInputRowNum * - Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); - case RIGHT_ANTI: - case RIGHT_SEMI: - return (long) (rightInputRowNum * - Math.pow(GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR, joinSpec.getPredicates().size())); - } - - throw new TajoInternalError("Invalide join type: " + joinSpec.getType()); - } - - /** - * 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; - } - } -} diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java index 04b2c67de6..a46d66e344 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PostLogicalPlanVerifier.java @@ -19,77 +19,57 @@ package org.apache.tajo.plan.verifier; import org.apache.tajo.algebra.JoinType; -import org.apache.tajo.catalog.SchemaUtil; +import org.apache.tajo.exception.InvalidInputsForCrossJoin; import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TooLargeInputForCrossJoinException; -import org.apache.tajo.exception.TooLargeResultForCrossJoinException; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.joinorder.GreedyHeuristicJoinOrderAlgorithm; import org.apache.tajo.plan.logical.*; -import org.apache.tajo.plan.util.PlanVerifierUtil; -import org.apache.tajo.plan.verifier.PostLogicalPlanVerifier.InputContext; +import org.apache.tajo.plan.verifier.PostLogicalPlanVerifier.Context; import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor; import org.apache.tajo.util.TUtil; -import java.util.Set; +import java.util.List; import java.util.Stack; -public class PostLogicalPlanVerifier extends BasicLogicalPlanVisitor { - - public static class VerifyContext { - private long broadcastThresholdForNonCrossJoin; - private long broadcastThresholdForCrossJoin; - private long crossJoinResultThreshold; - - public VerifyContext(long broadcastThresholdForNonCrossJoin, - long broadcastThresholdForCrossJoin, - long crossJoinResultThreshold) { - this.broadcastThresholdForNonCrossJoin = broadcastThresholdForNonCrossJoin; - this.broadcastThresholdForCrossJoin = broadcastThresholdForCrossJoin; - this.crossJoinResultThreshold = crossJoinResultThreshold; - } - } +/** + * + * PostLogicalPlanVerifier verifies the logical plan with some physical information. + */ +public class PostLogicalPlanVerifier extends BasicLogicalPlanVisitor { - static class InputContext { - VerifyContext verifyContext; + static class Context { + long bcastLimitForCrossJoin; VerificationState state; - double estimatedResultSize; - double estimatedRowNum; - Set nonBroadcastableRelations = TUtil.newHashSet(); - public InputContext(VerificationState state) { + public Context(VerificationState state, long bcastLimitForCrossJoin) { this.state = state; + this.bcastLimitForCrossJoin = bcastLimitForCrossJoin; } } - public VerificationState verify(VerifyContext verifyContext, VerificationState state, LogicalPlan plan) + public VerificationState verify(long broadcastThresholdForCrossJoin, VerificationState state, LogicalPlan plan) throws TajoException { - InputContext context = new InputContext(state); - context.verifyContext = verifyContext; + Context context = new Context(state, broadcastThresholdForCrossJoin); visit(context, plan, plan.getRootBlock()); return context.state; } @Override - public Object visitJoin(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, JoinNode node, + public Object visitJoin(Context context, LogicalPlan plan, LogicalPlan.QueryBlock block, JoinNode node, Stack stack) throws TajoException { - stack.push(node); - visit(context, plan, block, node.getLeftChild(), stack); - double estimatedLeftResultSize = context.estimatedResultSize; - double estimatedLeftRowNum = context.estimatedRowNum; - visit(context, plan, block, node.getRightChild(), stack); - stack.pop(); - - context.estimatedRowNum = PlanVerifierUtil.estimateOutputRowNumForJoin(node.getJoinSpec(), - estimatedLeftRowNum, context.estimatedRowNum); - context.estimatedResultSize = context.estimatedRowNum * - SchemaUtil.estimateRowByteSizeWithSchema(node.getOutSchema()); + super.visitJoin(context, plan, block, node, stack); if (node.getJoinType() == JoinType.CROSS) { + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // // Cross join is one of the most heavy operations. To avoid the trouble caused by exhausting resources to perform // cross join, we allow it only when it does not burden cluster too much. // + // Currently, we simply allow the cross join only when it has at least one of inputs is a broadcastable relation. + // However, we can lose a lot of possible opportunities because this rule is too simple. + // This rule must be improved as follows. + // // If the join type is cross, the following two restrictions are checked. // 1) The expected result size does not exceed the predefined threshold. // 2) Cross join must be executed with broadcast join. @@ -98,108 +78,71 @@ public Object visitJoin(InputContext context, LogicalPlan plan, LogicalPlan.Quer // 1) There is at most a single relation which size is greater than the broadcast join threshold for non-cross // join. // 2) At least one of the cross join's inputs must not exceed the broadcast join threshold for cross join. + // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// - if (estimatedLeftResultSize > context.verifyContext.broadcastThresholdForCrossJoin && - context.estimatedResultSize > context.verifyContext.broadcastThresholdForCrossJoin) { - context.state.addVerification(new TooLargeInputForCrossJoinException( - context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]), - context.verifyContext.broadcastThresholdForCrossJoin - )); - } - - if (context.nonBroadcastableRelations.size() > 1) { - context.state.addVerification(new TooLargeInputForCrossJoinException( - context.nonBroadcastableRelations.toArray(new String[context.nonBroadcastableRelations.size()]), - context.verifyContext.broadcastThresholdForCrossJoin - )); - } - - if (context.verifyContext.crossJoinResultThreshold < context.estimatedResultSize) { - context.state.addVerification( - new TooLargeResultForCrossJoinException(context.verifyContext.crossJoinResultThreshold)); + if (!isSimpleRelationNode(node.getLeftChild()) && !isSimpleRelationNode(node.getRightChild())) { + context.state.addVerification(new InvalidInputsForCrossJoin()); + } else { + + boolean crossJoinAllowed = false; + List largeRelationNames = TUtil.newList(); + + if (isSimpleRelationNode(node.getLeftChild())) { + if (getTableVolume((ScanNode) node.getLeftChild()) <= context.bcastLimitForCrossJoin) { + crossJoinAllowed = true; + } else { + largeRelationNames.add(((ScanNode) node.getLeftChild()).getCanonicalName()); + } + } + + if (isSimpleRelationNode(node.getRightChild())) { + if (getTableVolume((ScanNode) node.getRightChild()) <= context.bcastLimitForCrossJoin) { + crossJoinAllowed = true; + } else { + largeRelationNames.add(((ScanNode) node.getRightChild()).getCanonicalName()); + } + + if (!crossJoinAllowed) { + context.state.addVerification(new TooLargeInputForCrossJoinException( + largeRelationNames.toArray(new String[largeRelationNames.size()]), + context.bcastLimitForCrossJoin)); + } + } } } return null; } - @Override - public Object visitProjection(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, ProjectionNode node, - Stack stack) throws TajoException { - super.visitProjection(context, plan, block, node, stack); - context.estimatedResultSize *= (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getOutSchema()) / - (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getInSchema()); - return null; - } - - @Override - public Object visitLimit(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, LimitNode node, - Stack stack) throws TajoException { - super.visitLimit(context, plan, block, node, stack); - context.estimatedRowNum = node.getFetchFirstNum(); - context.estimatedResultSize = node.getFetchFirstNum() * - SchemaUtil.estimateRowByteSizeWithSchema(node.getOutSchema()); - return null; - } - - @Override - public Object visitFilter(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, SelectionNode node, - Stack stack) throws TajoException { - super.visitFilter(context, plan, block, node, stack); - context.estimatedResultSize *= GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR; - context.estimatedRowNum *= GreedyHeuristicJoinOrderAlgorithm.DEFAULT_SELECTION_FACTOR; - return null; - } - - @Override - public Object visitUnion(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, UnionNode node, - Stack stack) throws TajoException { - stack.push(node); - if (plan != null) { - LogicalPlan.QueryBlock leftBlock = plan.getBlock(node.getLeftChild()); - visit(context, plan, leftBlock, leftBlock.getRoot(), stack); - double estimatedLeftResultSize = context.estimatedResultSize; - double estimatedLeftRowNum = context.estimatedRowNum; - LogicalPlan.QueryBlock rightBlock = plan.getBlock(node.getRightChild()); - visit(context, plan, rightBlock, rightBlock.getRoot(), stack); - context.estimatedResultSize += estimatedLeftResultSize; - context.estimatedRowNum += estimatedLeftRowNum; + private static boolean isSimpleRelationNode(LogicalNode node) { + if (node instanceof ScanNode) { + // PartitionedTableScanNode and IndexScanNode extends ScanNode. + // TableSubqueryNode is not the simple relation node. + return true; } else { - visit(context, null, null, node.getLeftChild(), stack); - double estimatedLeftResultSize = context.estimatedResultSize; - double estimatedLeftRowNum = context.estimatedRowNum; - visit(context, null, null, node.getRightChild(), stack); - context.estimatedResultSize += estimatedLeftResultSize; - context.estimatedRowNum += estimatedLeftRowNum; + return false; } - - stack.pop(); - return null; } - @Override - public Object visitScan(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, ScanNode node, - Stack stack) throws TajoException { - context.estimatedResultSize = PlanVerifierUtil.getTableVolume(node); - context.estimatedRowNum = context.estimatedResultSize / - (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getTableDesc().getLogicalSchema()); - if (context.estimatedResultSize > context.verifyContext.broadcastThresholdForNonCrossJoin) { - context.nonBroadcastableRelations.add(node.getTableDesc().getName()); - } - return null; - } + /** + * 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) { + 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; + } + } - @Override - public Object visitPartitionedTableScan(InputContext context, LogicalPlan plan, LogicalPlan.QueryBlock block, - PartitionedTableScanNode node, Stack stack) - throws TajoException { - context.estimatedResultSize = PlanVerifierUtil.getTableVolume(node); - context.estimatedRowNum = context.estimatedResultSize / - (double) SchemaUtil.estimateRowByteSizeWithSchema(node.getTableDesc().getLogicalSchema()); - if (context.estimatedResultSize > context.verifyContext.broadcastThresholdForNonCrossJoin) { - context.nonBroadcastableRelations.add(node.getTableDesc().getName()); + return scanBytes; + } else { + return -1; } - return null; } } From a8b09aa92d262cd605b25222f3c10864b6aa4264 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Thu, 20 Aug 2015 18:35:08 +0900 Subject: [PATCH 09/18] fix compilation error --- .../exception/InvalidInputsForCrossJoin.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 index 0a13a0d069..3fafd3961b 100644 --- a/tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java +++ b/tajo-common/src/main/java/org/apache/tajo/exception/InvalidInputsForCrossJoin.java @@ -1,3 +1,21 @@ +/** + * 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; From d722933944e70ba90831957c5bd3c7d03f20a9f6 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Fri, 21 Aug 2015 18:34:46 +0900 Subject: [PATCH 10/18] Fix broadcast join test --- .../org/apache/tajo/QueryTestCaseBase.java | 6 +- .../org/apache/tajo/benchmark/TestTPCH.java | 12 ++ .../tajo/engine/query/TestJoinQuery.java | 2 + .../testJoinWithMultipleJoinQual1.Hash.plan | 4 +- ...ithMultipleJoinQual1.Hash_NoBroadcast.plan | 4 +- .../testJoinWithMultipleJoinQual1.Sort.plan | 4 +- ...ithMultipleJoinQual1.Sort_NoBroadcast.plan | 4 +- .../testJoinWithOrPredicates.Hash.plan | 4 +- ...JoinWithOrPredicates.Hash_NoBroadcast.plan | 4 +- .../testJoinWithOrPredicates.Sort.plan | 4 +- ...JoinWithOrPredicates.Sort_NoBroadcast.plan | 4 +- .../testNaturalJoin.Hash.plan | 4 +- .../testNaturalJoin.Hash_NoBroadcast.plan | 4 +- .../testNaturalJoin.Sort.plan | 4 +- .../testNaturalJoin.Sort_NoBroadcast.plan | 4 +- ...stJoinFilterOfRowPreservedTable1.Hash.plan | 4 +- ...OfRowPreservedTable1.Hash_NoBroadcast.plan | 4 +- ...stJoinFilterOfRowPreservedTable1.Sort.plan | 4 +- ...OfRowPreservedTable1.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 ++++------- ...uterJoinPredicationCaseByCase1.1.Hash.plan | 4 +- ...icationCaseByCase1.1.Hash_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase1.1.Sort.plan | 4 +- ...icationCaseByCase1.1.Sort_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase2.1.Hash.plan | 67 +++------- ...uterJoinPredicationCaseByCase2.1.Sort.plan | 67 +++------- ...uterJoinPredicationCaseByCase3.1.Hash.plan | 4 +- ...icationCaseByCase3.1.Hash_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase3.1.Sort.plan | 4 +- ...icationCaseByCase3.1.Sort_NoBroadcast.plan | 4 +- .../testLeftOuterJoinWithNull2.Hash.plan | 4 +- ...ftOuterJoinWithNull2.Hash_NoBroadcast.plan | 4 +- .../testLeftOuterJoinWithNull2.Sort.plan | 4 +- ...ftOuterJoinWithNull2.Sort_NoBroadcast.plan | 4 +- .../testOuterJoinAndCaseWhen1.Hash.plan | 73 ++++------- .../testOuterJoinAndCaseWhen1.Sort.plan | 73 ++++------- ...uterJoinPredicationCaseByCase1.1.Hash.plan | 71 ++++------- ...icationCaseByCase1.1.Hash_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase1.1.Sort.plan | 71 ++++------- ...icationCaseByCase1.1.Sort_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase2.1.Hash.plan | 4 +- ...icationCaseByCase2.1.Hash_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase2.1.Sort.plan | 4 +- ...icationCaseByCase2.1.Sort_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase3.1.Hash.plan | 69 +++------- ...icationCaseByCase3.1.Hash_NoBroadcast.plan | 4 +- ...uterJoinPredicationCaseByCase3.1.Sort.plan | 69 +++------- ...icationCaseByCase3.1.Sort_NoBroadcast.plan | 4 +- .../engine/planner/global/ExecutionBlock.java | 4 +- .../rewriter/rules/BroadcastJoinRule.java | 70 ++++++++--- 55 files changed, 523 insertions(+), 769 deletions(-) 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 8200cec4f0..0f277f0780 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 @@ protected void runSimpleTests() throws Exception { // 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 @@ protected void runSimpleTests() throws Exception { 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", diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java b/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java index 53d43504ba..04c98677b5 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java @@ -65,4 +65,16 @@ public void testTPCHQ5() throws Exception { public void testFirstJoinInQ7() throws Exception { runSimpleTests(); } + + @Test + public void testMelon() throws Exception { + try { + executeString("create table partitioned_lineitem (l_orderkey int8, l_partkey int8, l_suppkey int8, l_linenumber int8, l_quantity float8, l_extendedprice float8, l_discount float8, l_tax float8, l_linestatus text, l_shipdate text, l_commitdate text, l_receiptdate text, l_shipinstruct text, l_shipmode text, l_comment text) partition by column (l_returnflag text) as select l_orderkey, l_partkey, l_suppkey, l_linenumber , l_quantity , l_extendedprice , l_discount , l_tax , l_linestatus , l_shipdate , l_commitdate , l_receiptdate , l_shipinstruct , l_shipmode , l_comment, l_returnflag from lineitem"); + + executeString("select l_linenumber, sum(sum_val) from ( select l_linenumber, sum(l_discount) sum_val from (select l_linenumber, l_discount, s_nationkey from partitioned_lineitem a1 left outer join supplier a2 on s_suppkey = l_suppkey where a2.s_suppkey is not null) t1 inner join nation t2 on t2.n_nationkey = t1.s_nationkey group by l_linenumber union select l_linenumber, sum(l_discount) sum_val from (select l_linenumber, l_discount, s_nationkey from partitioned_lineitem a1 left outer join supplier a2 on s_suppkey = l_suppkey where a2.s_suppkey is not null) t3 inner join nation t4 on t4.n_nationkey = t3.s_nationkey group by l_linenumber ) sx_std group by l_linenumber;"); + } finally { + executeString("drop table partitioned_lineitem purge"); + + } + } } \ No newline at end of file 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 706f201547..28fb8a3667 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 @@ -75,6 +75,8 @@ public TestJoinQuery(String joinOption) throws Exception { if (joinOption.indexOf("NoBroadcast") >= 0) { testingCluster.setAllTajoDaemonConfValue(ConfVars.$TEST_BROADCAST_JOIN_ENABLED.varname, "false"); + testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD.varname, + "" + 0); } if (joinOption.indexOf("Hash") >= 0) { diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan index 170763cae9..8570bc7574 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash.plan @@ -3,7 +3,7 @@ explain 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) 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) + => 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)} @@ -74,7 +74,7 @@ Block Id: eb_0000000000000_0000_000009 [LEAF] 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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan index 0b27fecd6d..1ab02db076 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Hash_NoBroadcast.plan @@ -3,7 +3,7 @@ explain 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) 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) + => 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)} @@ -217,7 +217,7 @@ Block Id: eb_0000000000000_0000_000009 [INTERMEDIATE] 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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan index 170763cae9..8570bc7574 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort.plan @@ -3,7 +3,7 @@ explain 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) 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) + => 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)} @@ -74,7 +74,7 @@ Block Id: eb_0000000000000_0000_000009 [LEAF] 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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan index 0b27fecd6d..1ab02db076 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithMultipleJoinQual1.Sort_NoBroadcast.plan @@ -3,7 +3,7 @@ explain 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) 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) + => 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)} @@ -217,7 +217,7 @@ Block Id: eb_0000000000000_0000_000009 [INTERMEDIATE] 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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan index c86757cbfc..b35f3a8356 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash.plan @@ -7,7 +7,7 @@ PROJECTION(4) SORT(3) => 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) @@ -50,7 +50,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash_NoBroadcast.plan index 155f466f7d..eb2483327e 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Hash_NoBroadcast.plan @@ -7,7 +7,7 @@ PROJECTION(4) SORT(3) => 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) @@ -79,7 +79,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan index c86757cbfc..b35f3a8356 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort.plan @@ -7,7 +7,7 @@ PROJECTION(4) SORT(3) => 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) @@ -50,7 +50,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort_NoBroadcast.plan index 155f466f7d..eb2483327e 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testJoinWithOrPredicates.Sort_NoBroadcast.plan @@ -7,7 +7,7 @@ PROJECTION(4) SORT(3) => 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) @@ -79,7 +79,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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) + => Search Cond: (default.n1.n_nationkey (INT4) IN (1, 2) OR default.n2.n_nationkey (INT4) IN (2)) JOIN(7)(INNER) => Join Cond: default.n1.n_name (TEXT) = default.n2.n_name (TEXT) => target list: default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4) diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan index 1ef6092da5..862f0e28dd 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} @@ -44,7 +44,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash_NoBroadcast.plan index 24ef41061e..1ac0252086 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Hash_NoBroadcast.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} @@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan index 1ef6092da5..862f0e28dd 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} @@ -44,7 +44,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort_NoBroadcast.plan index 24ef41061e..1ac0252086 100644 --- a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testNaturalJoin.Sort_NoBroadcast.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} @@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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) + => 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)))) => target list: default.n1.n_name (TEXT), default.n2.n_name (TEXT) => out schema: {(2) default.n1.n_name (TEXT), default.n2.n_name (TEXT)} => in schema: {(8) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4), default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan index 91199f65d4..e9d4ea76fe 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} @@ -44,7 +44,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash_NoBroadcast.plan index cbfb4194fe..7a0bf295b9 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Hash_NoBroadcast.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} @@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan index 91199f65d4..e9d4ea76fe 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} @@ -44,7 +44,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort_NoBroadcast.plan index cbfb4194fe..7a0bf295b9 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testJoinFilterOfRowPreservedTable1.Sort_NoBroadcast.plan @@ -3,7 +3,7 @@ explain SORT(3) => 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} @@ -73,7 +73,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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) + => Join Cond: (default.nation.n_regionkey (INT4) = default.region.r_regionkey (INT4) AND default.region.r_name (TEXT) IN (AMERICA, ASIA)) => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan index 997d761e5f..45923dc04f 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash.plan @@ -10,27 +10,27 @@ JOIN(11)(LEFT_OUTER) => out schema: {(2) default.d.n_name (TEXT), default.d.n_nationkey (INT4)} => in schema: {(4) default.d.n_comment (TEXT), default.d.n_name (TEXT), default.d.n_nationkey (INT4), default.d.n_regionkey (INT4)} JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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)} SCAN(1) on default.customer as b => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} - SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} + SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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)} explain ------------------------------- ------------------------------------------------------------------------------- @@ -64,27 +64,27 @@ JOIN(11)(LEFT_OUTER) => out schema: {(2) default.d.n_name (TEXT), default.d.n_nationkey (INT4)} => in schema: {(4) default.d.n_comment (TEXT), default.d.n_name (TEXT), default.d.n_nationkey (INT4), default.d.n_regionkey (INT4)} JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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)} SCAN(1) on default.customer as b => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} - SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} + SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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_000008 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash_NoBroadcast.plan index 6af4854d39..a634085630 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Hash_NoBroadcast.plan @@ -10,27 +10,27 @@ JOIN(11)(LEFT_OUTER) => out schema: {(2) default.d.n_name (TEXT), default.d.n_nationkey (INT4)} => in schema: {(4) default.d.n_comment (TEXT), default.d.n_name (TEXT), default.d.n_nationkey (INT4), default.d.n_regionkey (INT4)} JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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)} SCAN(1) on default.customer as b => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} - SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} + SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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)} explain ------------------------------- ------------------------------------------------------------------------------- @@ -41,16 +41,16 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008) |-eb_0000000000000_0000_000006 |-eb_0000000000000_0000_000005 |-eb_0000000000000_0000_000004 - |-eb_0000000000000_0000_000003 + |-eb_0000000000000_0000_000003 |-eb_0000000000000_0000_000002 - |-eb_0000000000000_0000_000001 + |-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 +1: eb_0000000000000_0000_000002 +2: eb_0000000000000_0000_000003 +3: eb_0000000000000_0000_000004 +4: eb_0000000000000_0000_000001 5: eb_0000000000000_0000_000005 6: eb_0000000000000_0000_000006 7: eb_0000000000000_0000_000007 @@ -58,86 +58,86 @@ Order of Execution ------------------------------------------------------------------------------- ======================================================= -Block Id: eb_0000000000000_0000_000001 [LEAF] +Block Id: eb_0000000000000_0000_000002 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) +[q_0000000000000_0000] 2 => 4 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) -SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} +SCAN(1) on default.customer as b + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} ======================================================= -Block Id: eb_0000000000000_0000_000002 [LEAF] +Block Id: eb_0000000000000_0000_000003 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) -SCAN(1) on default.customer as b - => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} +SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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_000003 [INTERMEDIATE] +Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE] ======================================================= [Incoming] -[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) -[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 2 => 4 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) [Outgoing] -[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - SCAN(14) on eb_0000000000000_0000_000002 + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(14) on eb_0000000000000_0000_000003 + => out schema: {(1) default.c.o_custkey (INT4)} + => in schema: {(1) default.c.o_custkey (INT4)} + SCAN(13) on eb_0000000000000_0000_000002 => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - SCAN(13) on eb_0000000000000_0000_000001 - => out schema: {(1) default.a.l_orderkey (INT4)} - => in schema: {(1) default.a.l_orderkey (INT4)} ======================================================= -Block Id: eb_0000000000000_0000_000004 [LEAF] +Block Id: eb_0000000000000_0000_000001 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) +[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) -SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} +SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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_000005 [INTERMEDIATE] ======================================================= [Incoming] -[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) -[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) +[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) [Outgoing] [q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} SCAN(16) on eb_0000000000000_0000_000004 - => out schema: {(1) default.c.o_custkey (INT4)} - => in schema: {(1) default.c.o_custkey (INT4)} - SCAN(15) on eb_0000000000000_0000_000003 - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + SCAN(15) on eb_0000000000000_0000_000001 + => out schema: {(1) default.a.l_orderkey (INT4)} + => in schema: {(1) default.a.l_orderkey (INT4)} ======================================================= Block Id: eb_0000000000000_0000_000006 [LEAF] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan index 997d761e5f..45923dc04f 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort.plan @@ -10,27 +10,27 @@ JOIN(11)(LEFT_OUTER) => out schema: {(2) default.d.n_name (TEXT), default.d.n_nationkey (INT4)} => in schema: {(4) default.d.n_comment (TEXT), default.d.n_name (TEXT), default.d.n_nationkey (INT4), default.d.n_regionkey (INT4)} JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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)} SCAN(1) on default.customer as b => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} - SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} + SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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)} explain ------------------------------- ------------------------------------------------------------------------------- @@ -64,27 +64,27 @@ JOIN(11)(LEFT_OUTER) => out schema: {(2) default.d.n_name (TEXT), default.d.n_nationkey (INT4)} => in schema: {(4) default.d.n_comment (TEXT), default.d.n_name (TEXT), default.d.n_nationkey (INT4), default.d.n_regionkey (INT4)} JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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)} SCAN(1) on default.customer as b => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} - SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} + SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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_000008 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort_NoBroadcast.plan index 6af4854d39..a634085630 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin2.Sort_NoBroadcast.plan @@ -10,27 +10,27 @@ JOIN(11)(LEFT_OUTER) => out schema: {(2) default.d.n_name (TEXT), default.d.n_nationkey (INT4)} => in schema: {(4) default.d.n_comment (TEXT), default.d.n_name (TEXT), default.d.n_nationkey (INT4), default.d.n_regionkey (INT4)} JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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)} SCAN(1) on default.customer as b => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} - SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} + SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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)} explain ------------------------------- ------------------------------------------------------------------------------- @@ -41,16 +41,16 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008) |-eb_0000000000000_0000_000006 |-eb_0000000000000_0000_000005 |-eb_0000000000000_0000_000004 - |-eb_0000000000000_0000_000003 + |-eb_0000000000000_0000_000003 |-eb_0000000000000_0000_000002 - |-eb_0000000000000_0000_000001 + |-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 +1: eb_0000000000000_0000_000002 +2: eb_0000000000000_0000_000003 +3: eb_0000000000000_0000_000004 +4: eb_0000000000000_0000_000001 5: eb_0000000000000_0000_000005 6: eb_0000000000000_0000_000006 7: eb_0000000000000_0000_000007 @@ -58,86 +58,86 @@ Order of Execution ------------------------------------------------------------------------------- ======================================================= -Block Id: eb_0000000000000_0000_000001 [LEAF] +Block Id: eb_0000000000000_0000_000002 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) +[q_0000000000000_0000] 2 => 4 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) -SCAN(0) on default.lineitem as a - => target list: default.a.l_orderkey (INT4) - => out schema: {(1) default.a.l_orderkey (INT4)} - => 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)} +SCAN(1) on default.customer as b + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} ======================================================= -Block Id: eb_0000000000000_0000_000002 [LEAF] +Block Id: eb_0000000000000_0000_000003 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) -SCAN(1) on default.customer as b - => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(8) default.b.c_acctbal (FLOAT8), default.b.c_address (TEXT), default.b.c_comment (TEXT), default.b.c_custkey (INT4), default.b.c_mktsegment (TEXT), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.b.c_phone (TEXT)} +SCAN(3) on default.orders as c + => target list: default.c.o_custkey (INT4) + => out schema: {(1) default.c.o_custkey (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_000003 [INTERMEDIATE] +Block Id: eb_0000000000000_0000_000004 [INTERMEDIATE] ======================================================= [Incoming] -[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) -[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 2 => 4 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 3 => 4 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) [Outgoing] -[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) JOIN(9)(LEFT_OUTER) - => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) - => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - SCAN(14) on eb_0000000000000_0000_000002 + => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => target list: default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(4) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + SCAN(14) on eb_0000000000000_0000_000003 + => out schema: {(1) default.c.o_custkey (INT4)} + => in schema: {(1) default.c.o_custkey (INT4)} + SCAN(13) on eb_0000000000000_0000_000002 => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} => in schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - SCAN(13) on eb_0000000000000_0000_000001 - => out schema: {(1) default.a.l_orderkey (INT4)} - => in schema: {(1) default.a.l_orderkey (INT4)} ======================================================= -Block Id: eb_0000000000000_0000_000004 [LEAF] +Block Id: eb_0000000000000_0000_000001 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) +[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) -SCAN(3) on default.orders as c - => target list: default.c.o_custkey (INT4) - => out schema: {(1) default.c.o_custkey (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)} +SCAN(0) on default.lineitem as a + => target list: default.a.l_orderkey (INT4) + => out schema: {(1) default.a.l_orderkey (INT4)} + => 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_000005 [INTERMEDIATE] ======================================================= [Incoming] -[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) -[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.c.o_custkey (INT4), num=32) +[q_0000000000000_0000] 1 => 5 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.b.c_custkey (INT4), num=32) [Outgoing] [q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE, key=default.a.l_orderkey (INT4), num=32) JOIN(10)(LEFT_OUTER) - => Join Cond: default.b.c_custkey (INT4) = default.c.o_custkey (INT4) + => Join Cond: default.a.l_orderkey (INT4) = default.b.c_custkey (INT4) => target list: default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4) => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(5) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4), default.c.o_custkey (INT4)} + => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} SCAN(16) on eb_0000000000000_0000_000004 - => out schema: {(1) default.c.o_custkey (INT4)} - => in schema: {(1) default.c.o_custkey (INT4)} - SCAN(15) on eb_0000000000000_0000_000003 - => out schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} - => in schema: {(4) default.a.l_orderkey (INT4), default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => out schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + => in schema: {(3) default.b.c_custkey (INT4), default.b.c_name (TEXT), default.b.c_nationkey (INT4)} + SCAN(15) on eb_0000000000000_0000_000001 + => out schema: {(1) default.a.l_orderkey (INT4)} + => in schema: {(1) default.a.l_orderkey (INT4)} ======================================================= Block Id: eb_0000000000000_0000_000006 [LEAF] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan index a688177610..61b4f629f4 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Hash.plan @@ -56,65 +56,23 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000012) ------------------------------------------------------------------------------- |-eb_0000000000000_0000_000012 |-eb_0000000000000_0000_000011 - |-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_000011 -4: eb_0000000000000_0000_000012 +1: eb_0000000000000_0000_000011 +2: eb_0000000000000_0000_000012 ------------------------------------------------------------------------------- -======================================================= -Block Id: eb_0000000000000_0000_000001 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 1 => 11 (type=HASH_SHUFFLE, key=default.a.c_custkey (INT4), num=32) - -SCAN(0) on default.customer as a - => target list: default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4) - => out schema: {(3) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4)} - => 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 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 4 => 11 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32) - -[Enforcers] - 0: type=Broadcast, tables=default.c - -JOIN(13)(LEFT_OUTER) - => Join Cond: default.b.l_orderkey (INT4) = default.c.o_orderkey (INT4) - => target list: default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT) - => out schema: {(2) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - => in schema: {(3) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4) - => out schema: {(2) default.c.o_orderdate (TEXT), 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)} - SCAN(1) on default.lineitem as b - => target list: default.b.l_orderkey (INT4) - => out schema: {(1) default.b.l_orderkey (INT4)} - => in schema: {(16) default.b.l_comment (TEXT), default.b.l_commitdate (TEXT), default.b.l_discount (FLOAT8), default.b.l_extendedprice (FLOAT8), default.b.l_linenumber (INT4), default.b.l_linestatus (TEXT), default.b.l_orderkey (INT4), default.b.l_partkey (INT4), default.b.l_quantity (FLOAT8), default.b.l_receiptdate (TEXT), default.b.l_returnflag (TEXT), default.b.l_shipdate (TEXT), default.b.l_shipinstruct (TEXT), default.b.l_shipmode (TEXT), default.b.l_suppkey (INT4), default.b.l_tax (FLOAT8)} - ======================================================= Block Id: eb_0000000000000_0000_000011 [ROOT] ======================================================= -[Incoming] -[q_0000000000000_0000] 1 => 11 (type=HASH_SHUFFLE, key=default.a.c_custkey (INT4), num=32) -[q_0000000000000_0000] 4 => 11 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32) - [Enforcers] 0: type=Broadcast, tables=default.e - 1: type=Broadcast, tables=default.d - 2: type=Broadcast, tables=default.f + 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) => Join Cond: default.f.p_partkey (INT4) = default.d.o_orderkey (INT4) @@ -148,12 +106,23 @@ JOIN(17)(LEFT_OUTER) => target list: default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT) => out schema: {(5) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} => in schema: {(5) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - SCAN(22) on eb_0000000000000_0000_000004 + JOIN(13)(LEFT_OUTER) + => Join Cond: default.b.l_orderkey (INT4) = default.c.o_orderkey (INT4) + => target list: default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT) => out schema: {(2) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - => in schema: {(2) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - SCAN(21) on eb_0000000000000_0000_000001 + => in schema: {(3) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4) + => out schema: {(2) default.c.o_orderdate (TEXT), 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)} + SCAN(1) on default.lineitem as b + => target list: default.b.l_orderkey (INT4) + => out schema: {(1) default.b.l_orderkey (INT4)} + => in schema: {(16) default.b.l_comment (TEXT), default.b.l_commitdate (TEXT), default.b.l_discount (FLOAT8), default.b.l_extendedprice (FLOAT8), default.b.l_linenumber (INT4), default.b.l_linestatus (TEXT), default.b.l_orderkey (INT4), default.b.l_partkey (INT4), default.b.l_quantity (FLOAT8), default.b.l_receiptdate (TEXT), default.b.l_returnflag (TEXT), default.b.l_shipdate (TEXT), default.b.l_shipinstruct (TEXT), default.b.l_shipmode (TEXT), default.b.l_suppkey (INT4), default.b.l_tax (FLOAT8)} + SCAN(0) on default.customer as a + => target list: default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4) => out schema: {(3) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4)} - => in schema: {(3) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4)} + => 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_000012 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan index a688177610..61b4f629f4 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoin3.Sort.plan @@ -56,65 +56,23 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000012) ------------------------------------------------------------------------------- |-eb_0000000000000_0000_000012 |-eb_0000000000000_0000_000011 - |-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_000011 -4: eb_0000000000000_0000_000012 +1: eb_0000000000000_0000_000011 +2: eb_0000000000000_0000_000012 ------------------------------------------------------------------------------- -======================================================= -Block Id: eb_0000000000000_0000_000001 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 1 => 11 (type=HASH_SHUFFLE, key=default.a.c_custkey (INT4), num=32) - -SCAN(0) on default.customer as a - => target list: default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4) - => out schema: {(3) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4)} - => 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 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 4 => 11 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32) - -[Enforcers] - 0: type=Broadcast, tables=default.c - -JOIN(13)(LEFT_OUTER) - => Join Cond: default.b.l_orderkey (INT4) = default.c.o_orderkey (INT4) - => target list: default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT) - => out schema: {(2) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - => in schema: {(3) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4)} - SCAN(3) on default.orders as c - => target list: default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4) - => out schema: {(2) default.c.o_orderdate (TEXT), 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)} - SCAN(1) on default.lineitem as b - => target list: default.b.l_orderkey (INT4) - => out schema: {(1) default.b.l_orderkey (INT4)} - => in schema: {(16) default.b.l_comment (TEXT), default.b.l_commitdate (TEXT), default.b.l_discount (FLOAT8), default.b.l_extendedprice (FLOAT8), default.b.l_linenumber (INT4), default.b.l_linestatus (TEXT), default.b.l_orderkey (INT4), default.b.l_partkey (INT4), default.b.l_quantity (FLOAT8), default.b.l_receiptdate (TEXT), default.b.l_returnflag (TEXT), default.b.l_shipdate (TEXT), default.b.l_shipinstruct (TEXT), default.b.l_shipmode (TEXT), default.b.l_suppkey (INT4), default.b.l_tax (FLOAT8)} - ======================================================= Block Id: eb_0000000000000_0000_000011 [ROOT] ======================================================= -[Incoming] -[q_0000000000000_0000] 1 => 11 (type=HASH_SHUFFLE, key=default.a.c_custkey (INT4), num=32) -[q_0000000000000_0000] 4 => 11 (type=HASH_SHUFFLE, key=default.b.l_orderkey (INT4), num=32) - [Enforcers] 0: type=Broadcast, tables=default.e - 1: type=Broadcast, tables=default.d - 2: type=Broadcast, tables=default.f + 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) => Join Cond: default.f.p_partkey (INT4) = default.d.o_orderkey (INT4) @@ -148,12 +106,23 @@ JOIN(17)(LEFT_OUTER) => target list: default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT) => out schema: {(5) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} => in schema: {(5) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4), default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - SCAN(22) on eb_0000000000000_0000_000004 + JOIN(13)(LEFT_OUTER) + => Join Cond: default.b.l_orderkey (INT4) = default.c.o_orderkey (INT4) + => target list: default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT) => out schema: {(2) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - => in schema: {(2) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT)} - SCAN(21) on eb_0000000000000_0000_000001 + => in schema: {(3) default.b.l_orderkey (INT4), default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4)} + SCAN(3) on default.orders as c + => target list: default.c.o_orderdate (TEXT), default.c.o_orderkey (INT4) + => out schema: {(2) default.c.o_orderdate (TEXT), 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)} + SCAN(1) on default.lineitem as b + => target list: default.b.l_orderkey (INT4) + => out schema: {(1) default.b.l_orderkey (INT4)} + => in schema: {(16) default.b.l_comment (TEXT), default.b.l_commitdate (TEXT), default.b.l_discount (FLOAT8), default.b.l_extendedprice (FLOAT8), default.b.l_linenumber (INT4), default.b.l_linestatus (TEXT), default.b.l_orderkey (INT4), default.b.l_partkey (INT4), default.b.l_quantity (FLOAT8), default.b.l_receiptdate (TEXT), default.b.l_returnflag (TEXT), default.b.l_shipdate (TEXT), default.b.l_shipinstruct (TEXT), default.b.l_shipmode (TEXT), default.b.l_suppkey (INT4), default.b.l_tax (FLOAT8)} + SCAN(0) on default.customer as a + => target list: default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4) => out schema: {(3) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4)} - => in schema: {(3) default.a.c_custkey (INT4), default.a.c_name (TEXT), default.a.c_nationkey (INT4)} + => 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_000012 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan index ea058ca738..ea17dbed53 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -45,7 +45,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] 1: type=Broadcast, tables=default.t3 JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan index 19ae617ae8..d9fa1fef23 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -112,7 +112,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] [q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32) JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan index ea058ca738..ea17dbed53 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -45,7 +45,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] 1: type=Broadcast, tables=default.t3 JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan index 19ae617ae8..d9fa1fef23 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -112,7 +112,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] [q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.t3.id (INT4), default.t3.id (INT4), num=32) JOIN(8)(LEFT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan index e3bb20c157..264aafe533 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Hash.plan @@ -38,63 +38,21 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008) ------------------------------------------------------------------------------- |-eb_0000000000000_0000_000008 |-eb_0000000000000_0000_000007 - |-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_000007 -4: eb_0000000000000_0000_000008 +1: eb_0000000000000_0000_000007 +2: eb_0000000000000_0000_000008 ------------------------------------------------------------------------------- -======================================================= -Block Id: eb_0000000000000_0000_000001 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 1 => 7 (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_000004 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 4 => 7 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32) - -[Enforcers] - 0: type=Broadcast, tables=default.t3 - -JOIN(9)(LEFT_OUTER) - => Join Cond: default.t2.id (INT4) = default.t3.id (INT4) - => target list: default.t2.id (INT4), default.t3.id (INT4) - => out schema: {(2) default.t2.id (INT4), default.t3.id (INT4)} - => in schema: {(2) 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)} - 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_000007 [ROOT] ======================================================= -[Incoming] -[q_0000000000000_0000] 1 => 7 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32) -[q_0000000000000_0000] 4 => 7 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32) - [Enforcers] - 0: type=Broadcast, tables=default.t4 + 0: type=Broadcast, tables=default.t3 + 1: type=Broadcast, tables=default.t2 + 2: type=Broadcast, tables=default.t4 JOIN(11)(INNER) => Join Cond: default.t2.id (INT4) = default.t4.id (INT4) @@ -110,10 +68,21 @@ JOIN(11)(INNER) => 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(16) on eb_0000000000000_0000_000004 + JOIN(9)(LEFT_OUTER) + => Join Cond: default.t2.id (INT4) = default.t3.id (INT4) + => target list: default.t2.id (INT4), default.t3.id (INT4) => out schema: {(2) default.t2.id (INT4), default.t3.id (INT4)} => in schema: {(2) default.t2.id (INT4), default.t3.id (INT4)} - SCAN(15) on eb_0000000000000_0000_000001 + 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)} + 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan index e3bb20c157..264aafe533 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase2.1.Sort.plan @@ -38,63 +38,21 @@ Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008) ------------------------------------------------------------------------------- |-eb_0000000000000_0000_000008 |-eb_0000000000000_0000_000007 - |-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_000007 -4: eb_0000000000000_0000_000008 +1: eb_0000000000000_0000_000007 +2: eb_0000000000000_0000_000008 ------------------------------------------------------------------------------- -======================================================= -Block Id: eb_0000000000000_0000_000001 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 1 => 7 (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_000004 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 4 => 7 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32) - -[Enforcers] - 0: type=Broadcast, tables=default.t3 - -JOIN(9)(LEFT_OUTER) - => Join Cond: default.t2.id (INT4) = default.t3.id (INT4) - => target list: default.t2.id (INT4), default.t3.id (INT4) - => out schema: {(2) default.t2.id (INT4), default.t3.id (INT4)} - => in schema: {(2) 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)} - 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_000007 [ROOT] ======================================================= -[Incoming] -[q_0000000000000_0000] 1 => 7 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32) -[q_0000000000000_0000] 4 => 7 (type=HASH_SHUFFLE, key=default.t2.id (INT4), num=32) - [Enforcers] - 0: type=Broadcast, tables=default.t4 + 0: type=Broadcast, tables=default.t3 + 1: type=Broadcast, tables=default.t2 + 2: type=Broadcast, tables=default.t4 JOIN(11)(INNER) => Join Cond: default.t2.id (INT4) = default.t4.id (INT4) @@ -110,10 +68,21 @@ JOIN(11)(INNER) => 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(16) on eb_0000000000000_0000_000004 + JOIN(9)(LEFT_OUTER) + => Join Cond: default.t2.id (INT4) = default.t3.id (INT4) + => target list: default.t2.id (INT4), default.t3.id (INT4) => out schema: {(2) default.t2.id (INT4), default.t3.id (INT4)} => in schema: {(2) default.t2.id (INT4), default.t3.id (INT4)} - SCAN(15) on eb_0000000000000_0000_000001 + 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)} + 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan index 79ce689762..d5e35ee5d2 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash.plan @@ -10,7 +10,7 @@ JOIN(8)(LEFT_OUTER) => out schema: {(1) default.t3.id (INT4)} => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)} JOIN(7)(LEFT_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 + => 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)} @@ -54,7 +54,7 @@ JOIN(8)(LEFT_OUTER) => out schema: {(1) default.t3.id (INT4)} => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)} JOIN(7)(LEFT_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 + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan index b2a14d0e02..d1a96c9f66 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan @@ -10,7 +10,7 @@ JOIN(8)(LEFT_OUTER) => out schema: {(1) default.t3.id (INT4)} => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)} JOIN(7)(LEFT_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 + => 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)} @@ -80,7 +80,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] [q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32) JOIN(7)(LEFT_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 + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan index 79ce689762..d5e35ee5d2 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort.plan @@ -10,7 +10,7 @@ JOIN(8)(LEFT_OUTER) => out schema: {(1) default.t3.id (INT4)} => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)} JOIN(7)(LEFT_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 + => 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)} @@ -54,7 +54,7 @@ JOIN(8)(LEFT_OUTER) => out schema: {(1) default.t3.id (INT4)} => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)} JOIN(7)(LEFT_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 + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan index b2a14d0e02..d1a96c9f66 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan @@ -10,7 +10,7 @@ JOIN(8)(LEFT_OUTER) => out schema: {(1) default.t3.id (INT4)} => in schema: {(2) default.t3.id (INT4), default.t3.name (TEXT)} JOIN(7)(LEFT_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 + => 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)} @@ -80,7 +80,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] [q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.t1.id (INT4), num=32) JOIN(7)(LEFT_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 + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan index f1e2800746..a8638e7104 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash.plan @@ -3,7 +3,7 @@ explain SORT(4) => 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce @@ -46,7 +46,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash_NoBroadcast.plan index 0ece2003f9..f5b1292a58 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Hash_NoBroadcast.plan @@ -3,7 +3,7 @@ explain SORT(4) => 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce @@ -75,7 +75,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan index f1e2800746..a8638e7104 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort.plan @@ -3,7 +3,7 @@ explain SORT(4) => 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce @@ -46,7 +46,7 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort_NoBroadcast.plan index 0ece2003f9..f5b1292a58 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testLeftOuterJoinWithNull2.Sort_NoBroadcast.plan @@ -3,7 +3,7 @@ explain SORT(4) => 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce @@ -75,7 +75,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] 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%' + => Search Cond: (default.orders.o_orderdate (TEXT) IS NOT NULL AND default.orders.o_orderdate (TEXT)LIKE'1996%') JOIN(7)(LEFT_OUTER) => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_orderkey (INT4) => target list: default.customer.c_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), coalesce(default.orders.o_orderstatus (TEXT),N/A) as ?coalesce diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan index b3360324d9..cbb82536ed 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Hash.plan @@ -32,64 +32,24 @@ 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.testouterjoinandcasewhen1 as a - => target list: default.a.id (INT4), default.a.name (TEXT) - => out schema: {(2) default.a.id (INT4), default.a.name (TEXT)} - => 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 [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), default.a.name (TEXT), num=32) [Enforcers] - 0: type=Broadcast, tables=default.c - -JOIN(8)(LEFT_OUTER) - => Join Cond: default.b.id (INT4) = default.c.id (INT4) - => target list: default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT) - => out schema: {(5) default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - => in schema: {(6) default.b.id (INT4), default.b.name (TEXT), default.c.id (INT4), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - SCAN(3) on default.testouterjoinandcasewhen1 as c - => target list: default.c.id (INT4), default.c.name (TEXT) - => out schema: {(2) default.c.id (INT4), default.c.name (TEXT)} - => in schema: {(4) default.c.id (INT4), default.c.name (TEXT), default.c.score (FLOAT4), default.c.type (TEXT)} - SCAN(1) on default.testouterjoinandcasewhen2 as b - => target list: default.b.id (INT4), default.b.id (INT4) as id2, default.b.name (TEXT), default.b.name (TEXT) as name2 - => out schema: {(4) default.b.id (INT4), default.b.name (TEXT), id2 (INT4), name2 (TEXT)} - => in schema: {(4) default.b.id (INT4), default.b.name (TEXT), default.b.score (FLOAT4), default.b.type (TEXT)} - -======================================================= -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), default.a.name (TEXT), num=32) + 0: type=Broadcast, tables=default.b + 1: type=Broadcast, tables=default.c SORT(15) => Sort Keys: default.a.id (INT4) (asc),default.a.name (TEXT) (asc) @@ -98,12 +58,23 @@ SORT(15) => target list: CASE WHEN default.b.name (TEXT) IS NULL THEN 9991231 ELSE default.b.name (TEXT) END as c1, CASE WHEN default.c.name (TEXT) IS NULL THEN 9991231 ELSE default.c.name (TEXT) END as c2, default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT) => out schema: {(6) c1 (TEXT), c2 (TEXT), default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT)} => in schema: {(7) default.a.id (INT4), default.a.name (TEXT), default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - SCAN(14) on eb_0000000000000_0000_000004 + JOIN(8)(LEFT_OUTER) + => Join Cond: default.b.id (INT4) = default.c.id (INT4) + => target list: default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT) => out schema: {(5) default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - => in schema: {(5) default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - SCAN(13) on eb_0000000000000_0000_000001 + => in schema: {(6) default.b.id (INT4), default.b.name (TEXT), default.c.id (INT4), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} + SCAN(3) on default.testouterjoinandcasewhen1 as c + => target list: default.c.id (INT4), default.c.name (TEXT) + => out schema: {(2) default.c.id (INT4), default.c.name (TEXT)} + => in schema: {(4) default.c.id (INT4), default.c.name (TEXT), default.c.score (FLOAT4), default.c.type (TEXT)} + SCAN(1) on default.testouterjoinandcasewhen2 as b + => target list: default.b.id (INT4), default.b.id (INT4) as id2, default.b.name (TEXT), default.b.name (TEXT) as name2 + => out schema: {(4) default.b.id (INT4), default.b.name (TEXT), id2 (INT4), name2 (TEXT)} + => in schema: {(4) default.b.id (INT4), default.b.name (TEXT), default.b.score (FLOAT4), default.b.type (TEXT)} + SCAN(0) on default.testouterjoinandcasewhen1 as a + => target list: default.a.id (INT4), default.a.name (TEXT) => out schema: {(2) default.a.id (INT4), default.a.name (TEXT)} - => in schema: {(2) default.a.id (INT4), default.a.name (TEXT)} + => in schema: {(4) default.a.id (INT4), default.a.name (TEXT), default.a.score (FLOAT4), default.a.type (TEXT)} ======================================================= Block Id: eb_0000000000000_0000_000006 [ROOT] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan index b3360324d9..cbb82536ed 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testOuterJoinAndCaseWhen1.Sort.plan @@ -32,64 +32,24 @@ 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.testouterjoinandcasewhen1 as a - => target list: default.a.id (INT4), default.a.name (TEXT) - => out schema: {(2) default.a.id (INT4), default.a.name (TEXT)} - => 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 [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), default.a.name (TEXT), num=32) [Enforcers] - 0: type=Broadcast, tables=default.c - -JOIN(8)(LEFT_OUTER) - => Join Cond: default.b.id (INT4) = default.c.id (INT4) - => target list: default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT) - => out schema: {(5) default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - => in schema: {(6) default.b.id (INT4), default.b.name (TEXT), default.c.id (INT4), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - SCAN(3) on default.testouterjoinandcasewhen1 as c - => target list: default.c.id (INT4), default.c.name (TEXT) - => out schema: {(2) default.c.id (INT4), default.c.name (TEXT)} - => in schema: {(4) default.c.id (INT4), default.c.name (TEXT), default.c.score (FLOAT4), default.c.type (TEXT)} - SCAN(1) on default.testouterjoinandcasewhen2 as b - => target list: default.b.id (INT4), default.b.id (INT4) as id2, default.b.name (TEXT), default.b.name (TEXT) as name2 - => out schema: {(4) default.b.id (INT4), default.b.name (TEXT), id2 (INT4), name2 (TEXT)} - => in schema: {(4) default.b.id (INT4), default.b.name (TEXT), default.b.score (FLOAT4), default.b.type (TEXT)} - -======================================================= -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), default.a.name (TEXT), num=32) + 0: type=Broadcast, tables=default.b + 1: type=Broadcast, tables=default.c SORT(15) => Sort Keys: default.a.id (INT4) (asc),default.a.name (TEXT) (asc) @@ -98,12 +58,23 @@ SORT(15) => target list: CASE WHEN default.b.name (TEXT) IS NULL THEN 9991231 ELSE default.b.name (TEXT) END as c1, CASE WHEN default.c.name (TEXT) IS NULL THEN 9991231 ELSE default.c.name (TEXT) END as c2, default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT) => out schema: {(6) c1 (TEXT), c2 (TEXT), default.a.id (INT4), default.a.name (TEXT), id2 (INT4), name2 (TEXT)} => in schema: {(7) default.a.id (INT4), default.a.name (TEXT), default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - SCAN(14) on eb_0000000000000_0000_000004 + JOIN(8)(LEFT_OUTER) + => Join Cond: default.b.id (INT4) = default.c.id (INT4) + => target list: default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT) => out schema: {(5) default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - => in schema: {(5) default.b.id (INT4), default.b.name (TEXT), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} - SCAN(13) on eb_0000000000000_0000_000001 + => in schema: {(6) default.b.id (INT4), default.b.name (TEXT), default.c.id (INT4), default.c.name (TEXT), id2 (INT4), name2 (TEXT)} + SCAN(3) on default.testouterjoinandcasewhen1 as c + => target list: default.c.id (INT4), default.c.name (TEXT) + => out schema: {(2) default.c.id (INT4), default.c.name (TEXT)} + => in schema: {(4) default.c.id (INT4), default.c.name (TEXT), default.c.score (FLOAT4), default.c.type (TEXT)} + SCAN(1) on default.testouterjoinandcasewhen2 as b + => target list: default.b.id (INT4), default.b.id (INT4) as id2, default.b.name (TEXT), default.b.name (TEXT) as name2 + => out schema: {(4) default.b.id (INT4), default.b.name (TEXT), id2 (INT4), name2 (TEXT)} + => in schema: {(4) default.b.id (INT4), default.b.name (TEXT), default.b.score (FLOAT4), default.b.type (TEXT)} + SCAN(0) on default.testouterjoinandcasewhen1 as a + => target list: default.a.id (INT4), default.a.name (TEXT) => out schema: {(2) default.a.id (INT4), default.a.name (TEXT)} - => in schema: {(2) default.a.id (INT4), default.a.name (TEXT)} + => in schema: {(4) default.a.id (INT4), default.a.name (TEXT), default.a.score (FLOAT4), default.a.type (TEXT)} ======================================================= Block Id: eb_0000000000000_0000_000006 [ROOT] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan index e0bb3a08b6..f347a88cf8 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(RIGHT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -29,72 +29,43 @@ 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.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) +[Enforcers] + 0: type=Broadcast, tables=default.t2 + 1: type=Broadcast, tables=default.t1 JOIN(8)(RIGHT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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 + SCAN(3) on default.jointable13 as t3 + => target list: default.t3.id (INT4) => out schema: {(1) default.t3.id (INT4)} - => in schema: {(1) default.t3.id (INT4)} - SCAN(12) on eb_0000000000000_0000_000003 + => 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)} ======================================================= Block Id: eb_0000000000000_0000_000006 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan index 735f3059e1..81c8d30683 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Hash_NoBroadcast.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(RIGHT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -112,7 +112,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] [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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan index e0bb3a08b6..f347a88cf8 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(RIGHT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -29,72 +29,43 @@ 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.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) +[Enforcers] + 0: type=Broadcast, tables=default.t2 + 1: type=Broadcast, tables=default.t1 JOIN(8)(RIGHT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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 + SCAN(3) on default.jointable13 as t3 + => target list: default.t3.id (INT4) => out schema: {(1) default.t3.id (INT4)} - => in schema: {(1) default.t3.id (INT4)} - SCAN(12) on eb_0000000000000_0000_000003 + => 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)} ======================================================= Block Id: eb_0000000000000_0000_000006 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan index 735f3059e1..81c8d30683 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase1.1.Sort_NoBroadcast.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(8)(RIGHT_OUTER) - => Join Cond: default.t1.id (INT4) = default.t3.id (INT4) AND default.t2.id (INT4) = default.t3.id (INT4) + => 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)} @@ -112,7 +112,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] [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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan index 22fc8cec55..a5043fff2c 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(9)(RIGHT_OUTER) - => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4) + => 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)} @@ -47,7 +47,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] 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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan index f5486f993f..3877a75be0 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Hash_NoBroadcast.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(9)(RIGHT_OUTER) - => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4) + => 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)} @@ -116,7 +116,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] [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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan index 22fc8cec55..a5043fff2c 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(9)(RIGHT_OUTER) - => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4) + => 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)} @@ -47,7 +47,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] 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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan index f5486f993f..3877a75be0 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase2.1.Sort_NoBroadcast.plan @@ -1,7 +1,7 @@ explain ------------------------------- JOIN(9)(RIGHT_OUTER) - => Join Cond: default.t3.id (INT4) = 2 AND default.t4.id (INT4) = default.t3.id (INT4) + => 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)} @@ -116,7 +116,7 @@ Block Id: eb_0000000000000_0000_000005 [ROOT] [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) + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan index 1c2fd7a370..c0de2a1f72 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash.plan @@ -10,7 +10,7 @@ JOIN(8)(RIGHT_OUTER) => 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 + => 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)} @@ -29,72 +29,43 @@ 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.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) +[Enforcers] + 0: type=Broadcast, tables=default.t2 + 1: type=Broadcast, tables=default.t1 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 + SCAN(3) on default.jointable13 as t3 + => target list: default.t3.id (INT4) => out schema: {(1) default.t3.id (INT4)} - => in schema: {(1) default.t3.id (INT4)} - SCAN(12) on eb_0000000000000_0000_000003 + => 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)} ======================================================= Block Id: eb_0000000000000_0000_000006 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan index 5a589ff07d..fab38091f8 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Hash_NoBroadcast.plan @@ -10,7 +10,7 @@ JOIN(8)(RIGHT_OUTER) => 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 + => 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)} @@ -80,7 +80,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] [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 + => 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)} diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan index 1c2fd7a370..c0de2a1f72 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort.plan @@ -10,7 +10,7 @@ JOIN(8)(RIGHT_OUTER) => 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 + => 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)} @@ -29,72 +29,43 @@ 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.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) +[Enforcers] + 0: type=Broadcast, tables=default.t2 + 1: type=Broadcast, tables=default.t1 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 + SCAN(3) on default.jointable13 as t3 + => target list: default.t3.id (INT4) => out schema: {(1) default.t3.id (INT4)} - => in schema: {(1) default.t3.id (INT4)} - SCAN(12) on eb_0000000000000_0000_000003 + => 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)} ======================================================= Block Id: eb_0000000000000_0000_000006 [TERMINAL] diff --git a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan index 5a589ff07d..fab38091f8 100644 --- a/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan +++ b/tajo-core-tests/src/test/resources/results/TestOuterJoinQuery/testRightOuterJoinPredicationCaseByCase3.1.Sort_NoBroadcast.plan @@ -10,7 +10,7 @@ JOIN(8)(RIGHT_OUTER) => 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 + => 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)} @@ -80,7 +80,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE] [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 + => 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)} 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 4f352c1c9d..c71324d576 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 @@ -194,8 +194,10 @@ public boolean isUnionOnly() { } public void addBroadcastRelation(ScanNode relationNode) { + if (!broadcastRelations.containsKey(relationNode.getCanonicalName())) { + enforcer.addBroadcast(relationNode.getCanonicalName()); + } broadcastRelations.put(relationNode.getCanonicalName(), relationNode); - enforcer.addBroadcast(relationNode.getCanonicalName()); } public void removeBroadcastRelation(ScanNode relationNode) { 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 index a67b75f732..dbb92e10bb 100644 --- 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 @@ -44,9 +44,6 @@ *

Broadcastable relation

* A relation is broadcastable when its size is smaller than a given threshold. * - *

Assumetion

- * If every input of an execution block is broadcastable, the output of the execution block is also broadcastable. - * *

Rules to convert repartition join into broadcast join

*
    *
  • 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.
  • @@ -67,11 +64,12 @@ public class BroadcastJoinRule implements GlobalPlanRewriteRule { private BroadcastJoinPlanBuilder planBuilder; private BroadcastJoinPlanFinalizer planFinalizer; - protected void init(MasterPlan plan, long thresholdForNonCrossJoin, long thresholdForCrossJoin) { + protected void init(MasterPlan plan, long thresholdForNonCrossJoin, long thresholdForCrossJoin, + boolean broadcastForNonCrossJoinEnabled) { GlobalPlanRewriteUtil.ParentFinder parentFinder = new GlobalPlanRewriteUtil.ParentFinder(); RelationSizeComparator relSizeComparator = new RelationSizeComparator(); planBuilder = new BroadcastJoinPlanBuilder(plan, relSizeComparator, parentFinder, thresholdForNonCrossJoin, - thresholdForCrossJoin); + thresholdForCrossJoin, broadcastForNonCrossJoinEnabled); planFinalizer = new BroadcastJoinPlanFinalizer(plan, relSizeComparator); } @@ -84,11 +82,12 @@ public String getName() { public boolean isEligible(OverridableConf queryContext, MasterPlan plan) { long thresholdForNonCrossJoin = queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD); long thresholdForCrossJoin = queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD); - if (queryContext.getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED) && thresholdForNonCrossJoin > 0 - || thresholdForCrossJoin > 0) { + boolean broadcastJoinEnabled = queryContext.getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED); + if (broadcastJoinEnabled && + (thresholdForNonCrossJoin > 0 || thresholdForCrossJoin > 0)) { for (LogicalPlan.QueryBlock block : plan.getLogicalPlan().getQueryBlocks()) { if (block.hasNode(NodeType.JOIN)) { - init(plan, thresholdForNonCrossJoin, thresholdForCrossJoin); + init(plan, thresholdForNonCrossJoin, thresholdForCrossJoin, broadcastJoinEnabled); return true; } } @@ -153,17 +152,20 @@ private class BroadcastJoinPlanBuilder implements DirectedGraphVisitor estimatedEbOutputSize = TUtil.newHashMap(); public BroadcastJoinPlanBuilder(MasterPlan plan, RelationSizeComparator relationSizeComparator, GlobalPlanRewriteUtil.ParentFinder parentFinder, - long thresholdForNonCrossJoin, long thresholdForCrossJoin) { + long thresholdForNonCrossJoin, long thresholdForCrossJoin, + boolean broadcastForNonCrossJoinEnabled) { this.plan = plan; this.relSizeComparator = relationSizeComparator; this.thresholdForNonCrossJoin = thresholdForNonCrossJoin; this.thresholdForCrossJoin = thresholdForCrossJoin; this.parentFinder = parentFinder; + this.broadcastForNonCrossJoinEnabled = broadcastForNonCrossJoinEnabled; } @Override @@ -185,7 +187,6 @@ public void visit(Stack stack, ExecutionBlockId executionBlock private void visitLeafNode(ExecutionBlock current) { // Preserved-row relations must not be broadcasted to avoid data duplication. if (!current.isPreservedRow()) { - // Assume that the output size is equal to the input size. long totalVolume = 0; for (ScanNode scanNode : current.getScanNodes()) { totalVolume += GlobalPlanRewriteUtil.getTableVolume(scanNode); @@ -217,15 +218,17 @@ private void visitNonLeafNode(ExecutionBlock current) { JoinType joinType = ((JoinNode)found).getJoinType(); for (ExecutionBlock child : childs) { - updateBroadcastableRelForChildEb(child, joinType); - updateInputBasedOnChildEb(child, current); + if (!child.isPreservedRow()) { + updateBroadcastableRelForChildEb(child, joinType); + updateInputBasedOnChildEb(child, current); + } } if (current.hasBroadcastRelation()) { // The current execution block and its every child are able to be merged. for (ExecutionBlock child : childs) { addUnionNodeIfNecessary(unionScanMap, plan, child, current); - mergeTwoPhaseJoin(plan, child, current); + mergeTwoPhaseJoinIfPossible(plan, child, current); } checkTotalSizeOfBroadcastableRelations(current); @@ -243,11 +246,11 @@ private void visitNonLeafNode(ExecutionBlock current) { } private void updateInputBasedOnChildEb(ExecutionBlock child, ExecutionBlock parent) { - if (!child.isPreservedRow() && isFullyBroadcastable(child)) { + if (isFullyBroadcastable(child)) { if (plan.isLeaf(child) && child.getScanNodes().length == 1) { try { updateScanOfParentAsBroadcastable(plan, child, parent); - } catch (TajoInternalError e) { + } catch (NoScanNodeForChildEbException e) { // This case is when the current has two or more inputs via union, and simply ignored. } } else { @@ -259,7 +262,40 @@ private void updateInputBasedOnChildEb(ExecutionBlock child, ExecutionBlock pare private void updateBroadcastableRelForChildEb(ExecutionBlock child, JoinType joinType) { long threshold = joinType == JoinType.CROSS ? thresholdForCrossJoin : thresholdForNonCrossJoin; for (ScanNode scanNode : child.getScanNodes()) { - if (GlobalPlanRewriteUtil.getTableVolume(scanNode) <= threshold) { + long volume = GlobalPlanRewriteUtil.getTableVolume(scanNode); + if (volume >= 0 && volume <= threshold) { + // If the child eb is already visited, the below line may update its broadcast relations. + // Furthermore, this operation might mark the preserved-row relation as the broadcast relation with outer join. + // However, the rewriting result is still valid. Please consider the following query: + // + // EX) SELECT ... FROM a LEFT OUTER JOIN b on ... LEFT OUTER JOIN c on ... + // + // and assume that three relations of a, b, and c are all broadcastable. + // The initial global plan will be as follow: + // + // EB 2) + // LEFT OUTER JOIN + // / \ + // c EB_1 + // EB 1) + // LEFT OUTER JOIN + // / \ + // a b + // + // When visiting EB_1, the bellow line marks only b as the broadcast relation because a is the preserved-row + // relation. However, when visiting EB_2, it marks both a and b as the broadcast relations because EB_1 is + // the null-supplying relation which has a and b as its inputs. + // Thus, the rewriting result will be like + // + // EB 2) broadcast: a, b + // LEFT OUTER JOIN + // / \ + // c LEFT OUTER JOIN + // / \ + // a b + // + // This plan returns the same result as a plan that broadcasts the result of the first join. + // Obviously, the result must be valid. child.addBroadcastRelation(scanNode); } } @@ -381,7 +417,7 @@ private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock c * @param parent parent block who has join nodes * @return */ - private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent) { + private ExecutionBlock mergeTwoPhaseJoinIfPossible(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent) { ScanNode scanForChild = findScanForChildEb(child, parent); parentFinder.set(scanForChild); From 003407cdb5b980437e5a1d482fc8c92a75c9868b Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Fri, 21 Aug 2015 22:55:17 +0900 Subject: [PATCH 11/18] fix test failure --- .../java/org/apache/tajo/SessionVars.java | 2 -- .../java/org/apache/tajo/conf/TajoConf.java | 1 - .../apache/tajo/exception/ErrorMessages.java | 3 -- .../apache/tajo/exception/ExceptionUtil.java | 1 - .../TooLargeResultForCrossJoinException.java | 33 ------------------- tajo-common/src/main/proto/errors.proto | 3 +- .../org/apache/tajo/cli/tsql/TestTajoCli.java | 5 ++- .../TestTajoCli/testHelpSessionVars.result | 5 +-- 8 files changed, 8 insertions(+), 45 deletions(-) delete mode 100644 tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.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 af290bbae5..7d47c23a32 100644 --- a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java +++ b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java @@ -94,8 +94,6 @@ public enum SessionVars implements ConfigKey { 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")), - CROSS_JOIN_RESULT_THRESHOLD(ConfVars.$DIST_QUERY_CROSS_JOIN_RESULT_THRESHOLD, - "restriction for the result size the 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")), 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 d2d76fb7a4..75826e69a2 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 @@ -314,7 +314,6 @@ public static enum ConfVars implements ConfigKey { (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_CROSS_JOIN_RESULT_THRESHOLD("tajo.dist-query.cross-join.result.threshold-bytes", 1024 * 1048576), // 1 GB $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), 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 b500e75e21..edae2d73a4 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 @@ -111,9 +111,6 @@ public class ErrorMessages { 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(TOO_LARGE_RESULT_FOR_CROSS_JOIN, "Estimated size of cross join is too large." + - "To execute cross join, please increase CROSS_JOIN_RESULT_THRESHOLD " + - "which is currently set to %s.", 1); ADD_MESSAGE(INVALID_INPUTS_FOR_CROSS_JOIN, "At least one of both inputs for the cross join must be a simple " + "relation."); 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 9cbbf45b11..6e36f94f2d 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 @@ -82,7 +82,6 @@ public class ExceptionUtil { ADD_EXCEPTION(MISSING_TABLE_PROPERTY, MissingTablePropertyException.class); ADD_EXCEPTION(TOO_LARGE_INPUT_FOR_CROSS_JOIN, TooLargeInputForCrossJoinException.class); - ADD_EXCEPTION(TOO_LARGE_RESULT_FOR_CROSS_JOIN, TooLargeResultForCrossJoinException.class); ADD_EXCEPTION(INVALID_INPUTS_FOR_CROSS_JOIN, InvalidInputsForCrossJoin.class); } diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java b/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java deleted file mode 100644 index 90bca465d2..0000000000 --- a/tajo-common/src/main/java/org/apache/tajo/exception/TooLargeResultForCrossJoinException.java +++ /dev/null @@ -1,33 +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.exception; - -import org.apache.tajo.error.Errors.ResultCode; -import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState; - -public class TooLargeResultForCrossJoinException extends TajoException { - - public TooLargeResultForCrossJoinException(ReturnState e) { - super(e); - } - - public TooLargeResultForCrossJoinException(long currentThreshold) { - super(ResultCode.TOO_LARGE_RESULT_FOR_CROSS_JOIN, currentThreshold + ""); - } -} diff --git a/tajo-common/src/main/proto/errors.proto b/tajo-common/src/main/proto/errors.proto index 53b8b6d3d2..b947a95cc8 100644 --- a/tajo-common/src/main/proto/errors.proto +++ b/tajo-common/src/main/proto/errors.proto @@ -182,8 +182,7 @@ enum ResultCode { STATEMENT_TOO_COMPLEX = 54001; STRING_CONSTANT_TOOL_LONG = 54002; TOO_LARGE_INPUT_FOR_CROSS_JOIN = 54003; - TOO_LARGE_RESULT_FOR_CROSS_JOIN = 54004; - INVALID_INPUTS_FOR_CROSS_JOIN = 54005; + INVALID_INPUTS_FOR_CROSS_JOIN = 54004; TOO_MANY_TABLES = 54006; TOO_MANY_COLUMNS = 54011; 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 e744631bc3..5005670045 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.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.*; diff --git a/tajo-core-tests/src/test/resources/results/TestTajoCli/testHelpSessionVars.result b/tajo-core-tests/src/test/resources/results/TestTajoCli/testHelpSessionVars.result index 1f878f13fb..33443da521 100644 --- a/tajo-core-tests/src/test/resources/results/TestTajoCli/testHelpSessionVars.result +++ b/tajo-core-tests/src/test/resources/results/TestTajoCli/testHelpSessionVars.result @@ -18,7 +18,8 @@ Available Session Variables: \set LC_MONETARY [text value] - Formatting of currency amounts \set LC_NUMERIC [text value] - Formatting of numbers \set LC_TIME [text value] - Formatting of dates and times -\set BROADCAST_TABLE_SIZE_LIMIT [long value] - limited size (bytes) of broadcast table +\set BROADCAST_NON_CROSS_JOIN_THRESHOLD [long value] - restriction for the total bytes of broadcasted table for non-cross join +\set BROADCAST_CROSS_JOIN_THRESHOLD [long value] - restriction for the total bytes of broadcasted table for cross join \set JOIN_TASK_INPUT_SIZE [int value] - join task input size (mb) \set SORT_TASK_INPUT_SIZE [int value] - sort task input size (mb) \set GROUPBY_TASK_INPUT_SIZE [int value] - group by task input size (mb) @@ -41,4 +42,4 @@ Available Session Variables: \set ARITHABORT [true or false] - If true, a running query will be terminated when an overflow or divide-by-zero occurs. \set FETCH_ROWNUM [int value] - Sets the number of rows at a time from Master \set BLOCK_ON_RESULT [true or false] - Whether to block result set on query execution -\set DEBUG_ENABLED [true or false] - (debug only) debug mode enabled +\set DEBUG_ENABLED [true or false] - (debug only) debug mode enabled \ No newline at end of file From 1052d88324c958fa04f9947a5a620196e44a0459 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Sun, 23 Aug 2015 01:14:19 +0900 Subject: [PATCH 12/18] hash cross join --- .../engine/planner/PhysicalPlannerImpl.java | 6 +- .../planner/physical/CommonHashJoinExec.java | 56 +++++++++++++++---- .../engine/planner/physical/HashJoinExec.java | 10 +++- .../tajo/worker/ExecutionBlockContext.java | 2 +- .../worker/ExecutionBlockSharedResource.java | 9 +++ 5 files changed, 67 insertions(+), 16 deletions(-) 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 5bbf3a9b25..bc5f158ed6 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 @@ -343,7 +343,11 @@ private PhysicalExec createCrossJoinPlan(TaskAttemptContext context, JoinNode pl } } else { - return new BNLJoinExec(context, plan, leftExec, rightExec); +// return new BNLJoinExec(context, plan, leftExec, rightExec); + LOG.info("Join (" + plan.getPID() +") chooses [In-memory Hash Join]"); + // returns two PhysicalExec. smaller one is 0, and larger one is 1. + PhysicalExec [] orderedChilds = switchJoinSidesIfNecessary(context, plan, leftExec, rightExec); + return new HashJoinExec(context, plan, orderedChilds[1], orderedChilds[0]); } } 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 0d64e659e1..044a834691 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 @@ -18,11 +18,13 @@ package org.apache.tajo.engine.planner.physical; +import org.apache.tajo.algebra.JoinType; import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.engine.planner.KeyProjector; import org.apache.tajo.engine.utils.CacheHolder; import org.apache.tajo.engine.utils.TableCacheKey; +import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.plan.logical.JoinNode; import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.storage.Tuple; @@ -60,22 +62,32 @@ public abstract class CommonHashJoinExec extends CommonJoinExec { public CommonHashJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec outer, PhysicalExec inner) { super(context, plan, outer, inner); - // HashJoin only can manage equi join key pairs. - this.joinKeyPairs = PlannerUtil.getJoinKeyPairs(joinQual, outer.getSchema(), - inner.getSchema(), false); + if (joinQual != null) { + // HashJoin only can manage equi join key pairs. + this.joinKeyPairs = PlannerUtil.getJoinKeyPairs(joinQual, outer.getSchema(), + inner.getSchema(), false); - leftKeyList = new Column[joinKeyPairs.size()]; - rightKeyList = new Column[joinKeyPairs.size()]; + leftKeyList = new Column[joinKeyPairs.size()]; + rightKeyList = new Column[joinKeyPairs.size()]; - for (int i = 0; i < joinKeyPairs.size(); i++) { - leftKeyList[i] = outer.getSchema().getColumn(joinKeyPairs.get(i)[0].getQualifiedName()); - rightKeyList[i] = inner.getSchema().getColumn(joinKeyPairs.get(i)[1].getQualifiedName()); - } + for (int i = 0; i < joinKeyPairs.size(); i++) { + leftKeyList[i] = outer.getSchema().getColumn(joinKeyPairs.get(i)[0].getQualifiedName()); + rightKeyList[i] = inner.getSchema().getColumn(joinKeyPairs.get(i)[1].getQualifiedName()); + } - leftNumCols = outer.getSchema().size(); - rightNumCols = inner.getSchema().size(); + leftNumCols = outer.getSchema().size(); + rightNumCols = inner.getSchema().size(); - leftKeyExtractor = new KeyProjector(leftSchema, leftKeyList); + leftKeyExtractor = new KeyProjector(leftSchema, leftKeyList); + } else { + if (plan.getJoinType() != JoinType.CROSS) { + throw new TajoInternalError("Any join condition must be defined for " +plan.getJoinType()); + } + joinKeyPairs = null; + rightNumCols = leftNumCols = -1; + leftKeyList = rightKeyList = null; + leftKeyExtractor = null; + } } protected void loadRightToHashTable() throws IOException { @@ -109,6 +121,26 @@ protected void loadRightFromCache(TableCacheKey key) throws IOException { } protected TupleMap buildRightToHashTable() throws IOException { + if (rightKeyList == null) { + return buildRightToHashTableForCrossJoin(); + } else { + return buildRightToHashTableForNonCrossJoin(); + } + } + + protected TupleMap buildRightToHashTableForCrossJoin() throws IOException { + Tuple tuple; + TupleMap map = new TupleMap<>(1); + TupleList tuples = new TupleList(); + + while (!context.isStopped() && (tuple = rightChild.next()) != null) { + tuples.add(tuple); + } + map.put(null, tuples); + return map; + } + + protected TupleMap buildRightToHashTableForNonCrossJoin() throws IOException { Tuple tuple; TupleMap map = new TupleMap(100000); KeyProjector keyProjector = new KeyProjector(rightSchema, rightKeyList); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java index bd817bbddf..ba9395e207 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java @@ -35,7 +35,8 @@ public HashJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec left @Override protected TupleMap convert(TupleMap hashed, boolean fromCache) throws IOException { - return fromCache ? new TupleMap(hashed) : hashed; +// return fromCache ? new TupleMap(hashed) : hashed; + return hashed; } @Override @@ -59,7 +60,12 @@ public Tuple next() throws IOException { frameTuple.setLeft(leftTuple); // getting corresponding right - Iterable hashed = tupleSlots.get(leftKeyExtractor.project(leftTuple)); + Iterable hashed; + if (leftKeyExtractor != null) { + hashed = tupleSlots.get(leftKeyExtractor.project(leftTuple)); + } else { + hashed = tupleSlots.get(null); + } Iterator rightTuples = rightFiltered(hashed); if (rightTuples.hasNext()) { iterator = rightTuples; diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockContext.java b/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockContext.java index 57bedd28da..6f923449ff 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockContext.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockContext.java @@ -72,7 +72,7 @@ public class ExecutionBlockContext { private TajoWorker.WorkerContext workerContext; private String plan; - private ExecutionBlockSharedResource resource; + private final ExecutionBlockSharedResource resource; private TajoQueryEngine queryEngine; private RpcClientManager connManager; diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java b/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java index 1a83104fae..042ca0997e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java @@ -43,6 +43,7 @@ public class ExecutionBlockSharedResource { private AtomicBoolean initializing = new AtomicBoolean(false); private volatile Boolean resourceInitSuccess = Boolean.valueOf(false); private final Object lock = new Object(); +// private final AtomicBoolean lock = new AtomicBoolean(false); // Query private QueryContext context; @@ -118,6 +119,14 @@ public synchronized Object getLock() { return lock; } +// public synchronized boolean getLock() { +// return lock.compareAndSet(false, true); +// } +// +// public synchronized void releaseLock() { +// lock.set(false); +// } + public boolean hasBroadcastCache(TableCacheKey key) { return TableCache.getInstance().hasCache(key); } From ed482567fe4062ccf496722cd308fc6e1b65ce2d Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Sun, 23 Aug 2015 14:50:14 +0900 Subject: [PATCH 13/18] remove bnl and nl joins --- .../planner/physical/TestBNLJoinExec.java | 224 ------------------ .../planner/physical/TestNLJoinExec.java | 208 ---------------- .../engine/planner/PhysicalPlannerImpl.java | 16 +- .../tajo/engine/planner/enforce/Enforcer.java | 4 - .../engine/planner/physical/BNLJoinExec.java | 187 --------------- .../BasicPhysicalExecutorVisitor.java | 18 +- .../engine/planner/physical/NLJoinExec.java | 75 ------ .../physical/PhysicalExecutorVisitor.java | 6 - .../java/org/apache/tajo/worker/TaskImpl.java | 7 + 9 files changed, 10 insertions(+), 735 deletions(-) delete mode 100644 tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java delete mode 100644 tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java delete mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java delete mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/NLJoinExec.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 71bad205b5..0000000000 --- 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); - } -} 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 d7968fecbc..0000000000 --- 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); - } -} 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 bc5f158ed6..70d263b8b2 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 @@ -330,20 +330,14 @@ private PhysicalExec createCrossJoinPlan(TaskAttemptContext context, JoinNode pl JoinAlgorithm algorithm = property.getJoin().getAlgorithm(); switch (algorithm) { - case NESTED_LOOP_JOIN: - LOG.info("Join (" + plan.getPID() +") chooses [Nested Loop Join]"); - return new NLJoinExec(context, plan, leftExec, rightExec); - case BLOCK_NESTED_LOOP_JOIN: - LOG.info("Join (" + plan.getPID() +") chooses [Block Nested Loop Join]"); - return new BNLJoinExec(context, plan, leftExec, rightExec); default: // fallback algorithm LOG.error("Invalid Cross Join Algorithm Enforcer: " + algorithm.name()); - return new BNLJoinExec(context, plan, leftExec, rightExec); + PhysicalExec [] orderedChilds = switchJoinSidesIfNecessary(context, plan, leftExec, rightExec); + return new HashJoinExec(context, plan, orderedChilds[1], orderedChilds[0]); } } else { -// return new BNLJoinExec(context, plan, leftExec, rightExec); LOG.info("Join (" + plan.getPID() +") chooses [In-memory Hash Join]"); // returns two PhysicalExec. smaller one is 0, and larger one is 1. PhysicalExec [] orderedChilds = switchJoinSidesIfNecessary(context, plan, leftExec, rightExec); @@ -360,12 +354,6 @@ private PhysicalExec createInnerJoinPlan(TaskAttemptContext context, JoinNode pl JoinAlgorithm algorithm = property.getJoin().getAlgorithm(); switch (algorithm) { - case NESTED_LOOP_JOIN: - LOG.info("Join (" + plan.getPID() +") chooses [Nested Loop Join]"); - return new NLJoinExec(context, plan, leftExec, rightExec); - case BLOCK_NESTED_LOOP_JOIN: - LOG.info("Join (" + plan.getPID() +") chooses [Block Nested Loop Join]"); - return new BNLJoinExec(context, plan, leftExec, rightExec); case IN_MEMORY_HASH_JOIN: LOG.info("Join (" + plan.getPID() +") chooses [In-memory Hash Join]"); // returns two PhysicalExec. smaller one is 0, and larger one is 1. diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/enforce/Enforcer.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/enforce/Enforcer.java index 92ecadda62..d67cee83b0 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/enforce/Enforcer.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/enforce/Enforcer.java @@ -302,10 +302,6 @@ public static String toString(EnforceProperty property) { sb.append("type=Join,alg="); if (join.getAlgorithm() == JoinEnforce.JoinAlgorithm.MERGE_JOIN) { sb.append("merge_join"); - } else if (join.getAlgorithm() == JoinEnforce.JoinAlgorithm.NESTED_LOOP_JOIN) { - sb.append("nested_loop"); - } else if (join.getAlgorithm() == JoinEnforce.JoinAlgorithm.BLOCK_NESTED_LOOP_JOIN) { - sb.append("block_nested_loop"); } else if (join.getAlgorithm() == JoinEnforce.JoinAlgorithm.IN_MEMORY_HASH_JOIN) { sb.append("in_memory_hash"); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java deleted file mode 100644 index 0808ade614..0000000000 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BNLJoinExec.java +++ /dev/null @@ -1,187 +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.tajo.plan.logical.JoinNode; -import org.apache.tajo.plan.util.PlannerUtil; -import org.apache.tajo.storage.Tuple; -import org.apache.tajo.worker.TaskAttemptContext; - -import java.io.IOException; -import java.util.Iterator; - -public class BNLJoinExec extends CommonJoinExec { - - private TupleList leftTupleSlots; - private TupleList rightTupleSlots; - private Iterator leftIterator; - private Iterator rightIterator; - - private boolean leftEnd; - private boolean rightEnd; - - // temporal tuples and states for nested loop join - private Tuple leftTuple = null; - private Tuple rightNext = null; - - private final static int TUPLE_SLOT_SIZE = 10000; - - public BNLJoinExec(final TaskAttemptContext context, final JoinNode plan, - final PhysicalExec leftExec, PhysicalExec rightExec) { - super(context, plan, leftExec, rightExec); - this.leftTupleSlots = new TupleList(TUPLE_SLOT_SIZE); - this.rightTupleSlots = new TupleList(TUPLE_SLOT_SIZE); - this.leftIterator = leftTupleSlots.iterator(); - this.rightIterator = rightTupleSlots.iterator(); - this.rightEnd = false; - this.leftEnd = false; - - // for projection - if (!plan.hasTargets()) { - plan.setTargets(PlannerUtil.schemaToTargets(outSchema)); - } - } - - public Tuple next() throws IOException { - - if (leftTupleSlots.isEmpty()) { - for (int k = 0; k < TUPLE_SLOT_SIZE; k++) { - Tuple t = leftChild.next(); - if (t == null) { - leftEnd = true; - break; - } - leftTupleSlots.add(t); - } - leftIterator = leftTupleSlots.iterator(); - if (leftIterator.hasNext()) { - leftTuple = leftIterator.next(); - } else { - return null; - } - } - - if (rightTupleSlots.isEmpty()) { - for (int k = 0; k < TUPLE_SLOT_SIZE; k++) { - Tuple t = rightChild.next(); - if (t == null) { - rightEnd = true; - break; - } - rightTupleSlots.add(t); - } - rightIterator = rightTupleSlots.iterator(); - } - - if((rightNext = rightChild.next()) == null){ - rightEnd = true; - } - - while (!context.isStopped()) { - if (!rightIterator.hasNext()) { // if leftIterator ended - if (leftIterator.hasNext()) { // if rightTupleslot remains - leftTuple = leftIterator.next(); - rightIterator = rightTupleSlots.iterator(); - } else { - if (rightEnd) { - rightChild.rescan(); - rightEnd = false; - - if (leftEnd) { - return null; - } - leftTupleSlots.clear(); - for (int k = 0; k < TUPLE_SLOT_SIZE; k++) { - Tuple t = leftChild.next(); - if (t == null) { - leftEnd = true; - break; - } - leftTupleSlots.add(t); - } - if (leftTupleSlots.isEmpty()) { - return null; - } - leftIterator = leftTupleSlots.iterator(); - leftTuple = leftIterator.next(); - - } else { - leftIterator = leftTupleSlots.iterator(); - leftTuple = leftIterator.next(); - } - - rightTupleSlots.clear(); - if (rightNext != null) { - rightTupleSlots.add(rightNext); - for (int k = 1; k < TUPLE_SLOT_SIZE; k++) { // fill right - Tuple t = rightChild.next(); - if (t == null) { - rightEnd = true; - break; - } - rightTupleSlots.add(t); - } - } else { - for (int k = 0; k < TUPLE_SLOT_SIZE; k++) { // fill right - Tuple t = rightChild.next(); - if (t == null) { - rightEnd = true; - break; - } - rightTupleSlots.add(t); - } - } - - if ((rightNext = rightChild.next()) == null) { - rightEnd = true; - } - rightIterator = rightTupleSlots.iterator(); - } - } - - frameTuple.set(leftTuple, rightIterator.next()); - if (!hasJoinQual || joinQual.eval(frameTuple).isTrue()) { - return projector.eval(frameTuple); - } - } - return null; - } - - @Override - public void rescan() throws IOException { - super.rescan(); - rightEnd = false; - rightTupleSlots.clear(); - leftTupleSlots.clear(); - rightIterator = rightTupleSlots.iterator(); - leftIterator = leftTupleSlots.iterator(); - } - - @Override - public void close() throws IOException { - super.close(); - - rightTupleSlots.clear(); - leftTupleSlots.clear(); - rightTupleSlots = null; - leftTupleSlots = null; - rightIterator = null; - leftIterator = null; - } -} diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java index c2d93bb16f..b591b279e4 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java @@ -29,9 +29,7 @@ public RESULT visit(PhysicalExec exec, Stack stack, CONTEXT contex // Please keep all physical executors except for abstract class. // They should be ordered in an lexicography order of their names for easy code maintenance. - if (exec instanceof BNLJoinExec) { - return visitBNLJoin(context, (BNLJoinExec) exec, stack); - } else if (exec instanceof BSTIndexScanExec) { + if (exec instanceof BSTIndexScanExec) { return visitBSTIndexScan(context, (BSTIndexScanExec) exec, stack); } else if (exec instanceof EvalExprExec) { return visitEvalExpr(context, (EvalExprExec) exec, stack); @@ -63,8 +61,6 @@ public RESULT visit(PhysicalExec exec, Stack stack, CONTEXT contex return visitMergeFullOuterJoin(context, (MergeFullOuterJoinExec) exec, stack); } else if (exec instanceof MergeJoinExec) { return visitMergeJoin(context, (MergeJoinExec) exec, stack); - } else if (exec instanceof NLJoinExec) { - return visitNLJoin(context, (NLJoinExec) exec, stack); } else if (exec instanceof ProjectionExec) { return visitProjection(context, (ProjectionExec) exec, stack); } else if (exec instanceof RangeShuffleFileWriteExec) { @@ -103,12 +99,6 @@ private RESULT visitBinaryExecutor(CONTEXT context, BinaryPhysicalExec exec, Sta return r; } - @Override - public RESULT visitBNLJoin(CONTEXT context, BNLJoinExec exec, Stack stack) - throws PhysicalPlanningException { - return visitBinaryExecutor(context, exec, stack); - } - @Override public RESULT visitBSTIndexScan(CONTEXT context, BSTIndexScanExec exec, Stack stack) throws PhysicalPlanningException { @@ -205,12 +195,6 @@ public RESULT visitMergeJoin(CONTEXT context, MergeJoinExec exec, Stack stack) throws - PhysicalPlanningException { - return visitBinaryExecutor(context, exec, stack); - } - @Override public RESULT visitProjection(CONTEXT context, ProjectionExec exec, Stack stack) throws PhysicalPlanningException { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/NLJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/NLJoinExec.java deleted file mode 100644 index d3214c3b16..0000000000 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/NLJoinExec.java +++ /dev/null @@ -1,75 +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.tajo.plan.logical.JoinNode; -import org.apache.tajo.storage.Tuple; -import org.apache.tajo.worker.TaskAttemptContext; - -import java.io.IOException; - -public class NLJoinExec extends CommonJoinExec { - - // temporal tuples and states for nested loop join - private boolean needNewOuter; - private Tuple outerTuple = null; - private Tuple innerTuple = null; - - public NLJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec outer, - PhysicalExec inner) { - super(context, plan, outer, inner); - // for join - needNewOuter = true; - } - - public Tuple next() throws IOException { - while (!context.isStopped()) { - if (needNewOuter) { - outerTuple = leftChild.next(); - if (outerTuple == null) { - return null; - } - needNewOuter = false; - } - - innerTuple = rightChild.next(); - if (innerTuple == null) { - needNewOuter = true; - rightChild.rescan(); - continue; - } - - frameTuple.set(outerTuple, innerTuple); - if (hasJoinQual) { - if (joinQual.eval(frameTuple).isTrue()) { - return projector.eval(frameTuple); - } - } else { - return projector.eval(frameTuple); - } - } - return null; - } - - @Override - public void rescan() throws IOException { - super.rescan(); - needNewOuter = true; - } -} diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java index c4d90a564a..86d8b7dea6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java @@ -24,9 +24,6 @@ public interface PhysicalExecutorVisitor { - RESULT visitBNLJoin(CONTEXT context, BNLJoinExec exec, Stack stack) - throws PhysicalPlanningException; - RESULT visitBSTIndexScan(CONTEXT context, BSTIndexScanExec exec, Stack stack) throws PhysicalPlanningException; @@ -76,9 +73,6 @@ RESULT visitMergeFullOuterJoin(CONTEXT context, MergeFullOuterJoinExec exec, Sta RESULT visitMergeJoin(CONTEXT context, MergeJoinExec exec, Stack stack) throws PhysicalPlanningException; - RESULT visitNLJoin(CONTEXT context, NLJoinExec exec, Stack stack) - throws PhysicalPlanningException; - RESULT visitProjection(CONTEXT context, ProjectionExec exec, Stack stack) throws PhysicalPlanningException; diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java index 7b8d06f992..2366e4576e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java @@ -57,6 +57,7 @@ import org.apache.tajo.rpc.NullCallback; import org.apache.tajo.storage.*; import org.apache.tajo.storage.fragment.FileFragment; +import org.apache.tajo.storage.fragment.FragmentConvertor; import org.apache.tajo.util.NetUtils; import java.io.File; @@ -154,6 +155,12 @@ public void initPlan() throws IOException { ", Fragments (num: " + request.getFragments().size() + ")" + ", Fetches (total:" + request.getFetches().size() + ") :"); + LOG.info("Fragments of " + getTaskContext().getTaskId()); + for (FragmentProto eachProto : request.getFragments()) { + FileFragment fragment = FragmentConvertor.convert(FileFragment.class, eachProto); + LOG.info(fragment.toString()); + } + if(LOG.isDebugEnabled()) { for (FetchImpl f : request.getFetches()) { LOG.debug("Table Id: " + f.getName() + ", Simple URIs: " + f.getSimpleURIs()); From df9f89a4b01ef1a78268620a5f18a5b29b2d6c1b Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 24 Aug 2015 12:53:17 +0900 Subject: [PATCH 14/18] fix test failure --- .../tajo/engine/query/TestJoinQuery.java | 2 - .../planner/physical/CommonHashJoinExec.java | 73 +++++++++++-------- .../engine/planner/physical/HashJoinExec.java | 6 +- .../worker/ExecutionBlockSharedResource.java | 9 --- tajo-plan/src/main/proto/Plan.proto | 2 - 5 files changed, 47 insertions(+), 45 deletions(-) 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 28fb8a3667..706f201547 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 @@ -75,8 +75,6 @@ public TestJoinQuery(String joinOption) throws Exception { if (joinOption.indexOf("NoBroadcast") >= 0) { testingCluster.setAllTajoDaemonConfValue(ConfVars.$TEST_BROADCAST_JOIN_ENABLED.varname, "false"); - testingCluster.setAllTajoDaemonConfValue(ConfVars.$DIST_QUERY_BROADCAST_NON_CROSS_JOIN_THRESHOLD.varname, - "" + 0); } if (joinOption.indexOf("Hash") >= 0) { 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 044a834691..2f51c99124 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 @@ -42,51 +42,66 @@ */ public abstract class CommonHashJoinExec extends CommonJoinExec { - protected final List joinKeyPairs; - // temporal tuples and states for nested loop join protected boolean first = true; protected TupleMap tupleSlots; protected Iterator iterator; + protected final boolean isCrossJoin; + protected final List joinKeyPairs; + protected final int rightNumCols; protected final int leftNumCols; protected final Column[] leftKeyList; protected final Column[] rightKeyList; - protected boolean finished; protected final KeyProjector leftKeyExtractor; + protected boolean finished; + public CommonHashJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec outer, PhysicalExec inner) { super(context, plan, outer, inner); - if (joinQual != null) { - // HashJoin only can manage equi join key pairs. - this.joinKeyPairs = PlannerUtil.getJoinKeyPairs(joinQual, outer.getSchema(), - inner.getSchema(), false); - - leftKeyList = new Column[joinKeyPairs.size()]; - rightKeyList = new Column[joinKeyPairs.size()]; - - for (int i = 0; i < joinKeyPairs.size(); i++) { - leftKeyList[i] = outer.getSchema().getColumn(joinKeyPairs.get(i)[0].getQualifiedName()); - rightKeyList[i] = inner.getSchema().getColumn(joinKeyPairs.get(i)[1].getQualifiedName()); - } - - leftNumCols = outer.getSchema().size(); - rightNumCols = inner.getSchema().size(); - - leftKeyExtractor = new KeyProjector(leftSchema, leftKeyList); - } else { - if (plan.getJoinType() != JoinType.CROSS) { - throw new TajoInternalError("Any join condition must be defined for " +plan.getJoinType()); - } - joinKeyPairs = null; - rightNumCols = leftNumCols = -1; - leftKeyList = rightKeyList = null; - leftKeyExtractor = null; + switch (plan.getJoinType()) { + + case CROSS: + if (hasJoinQual) { + throw new TajoInternalError("Cross join cannot evaluate join conditions."); + } else { + isCrossJoin = true; + joinKeyPairs = null; + rightNumCols = leftNumCols = -1; + leftKeyList = rightKeyList = null; + leftKeyExtractor = null; + } + break; + + case INNER: + // Other join types except INNER join can have empty join condition. + if (!hasJoinQual) { + throw new TajoInternalError("Inner join must have any join conditions."); + } + default: + isCrossJoin = false; + // HashJoin only can manage equi join key pairs. + this.joinKeyPairs = PlannerUtil.getJoinKeyPairs(joinQual, outer.getSchema(), + inner.getSchema(), false); + + leftKeyList = new Column[joinKeyPairs.size()]; + rightKeyList = new Column[joinKeyPairs.size()]; + + for (int i = 0; i < joinKeyPairs.size(); i++) { + leftKeyList[i] = outer.getSchema().getColumn(joinKeyPairs.get(i)[0].getQualifiedName()); + rightKeyList[i] = inner.getSchema().getColumn(joinKeyPairs.get(i)[1].getQualifiedName()); + } + + leftNumCols = outer.getSchema().size(); + rightNumCols = inner.getSchema().size(); + + leftKeyExtractor = new KeyProjector(leftSchema, leftKeyList); + break; } } @@ -121,7 +136,7 @@ protected void loadRightFromCache(TableCacheKey key) throws IOException { } protected TupleMap buildRightToHashTable() throws IOException { - if (rightKeyList == null) { + if (isCrossJoin) { return buildRightToHashTableForCrossJoin(); } else { return buildRightToHashTableForNonCrossJoin(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java index ba9395e207..e4e4216440 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java @@ -35,8 +35,8 @@ public HashJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec left @Override protected TupleMap convert(TupleMap hashed, boolean fromCache) throws IOException { -// return fromCache ? new TupleMap(hashed) : hashed; - return hashed; + return fromCache ? new TupleMap(hashed) : hashed; +// return hashed; } @Override @@ -61,7 +61,7 @@ public Tuple next() throws IOException { // getting corresponding right Iterable hashed; - if (leftKeyExtractor != null) { + if (!isCrossJoin) { hashed = tupleSlots.get(leftKeyExtractor.project(leftTuple)); } else { hashed = tupleSlots.get(null); diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java b/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java index 042ca0997e..1a83104fae 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/ExecutionBlockSharedResource.java @@ -43,7 +43,6 @@ public class ExecutionBlockSharedResource { private AtomicBoolean initializing = new AtomicBoolean(false); private volatile Boolean resourceInitSuccess = Boolean.valueOf(false); private final Object lock = new Object(); -// private final AtomicBoolean lock = new AtomicBoolean(false); // Query private QueryContext context; @@ -119,14 +118,6 @@ public synchronized Object getLock() { return lock; } -// public synchronized boolean getLock() { -// return lock.compareAndSet(false, true); -// } -// -// public synchronized void releaseLock() { -// lock.set(false); -// } - public boolean hasBroadcastCache(TableCacheKey key) { return TableCache.getInstance().hasCache(key); } diff --git a/tajo-plan/src/main/proto/Plan.proto b/tajo-plan/src/main/proto/Plan.proto index da1e187437..0bfac0d1ef 100644 --- a/tajo-plan/src/main/proto/Plan.proto +++ b/tajo-plan/src/main/proto/Plan.proto @@ -608,8 +608,6 @@ message OutputDistinctEnforce { message JoinEnforce { enum JoinAlgorithm { - NESTED_LOOP_JOIN = 0; - BLOCK_NESTED_LOOP_JOIN = 1; IN_MEMORY_HASH_JOIN = 2; HYBRID_HASH_JOIN = 3; MERGE_JOIN = 4; From 58c1632fd14c64b9cfce3b97d9195729b48c54de Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 24 Aug 2015 15:27:45 +0900 Subject: [PATCH 15/18] fix test failure in hbase --- .../engine/planner/PhysicalPlannerImpl.java | 2 +- .../planner/physical/CommonHashJoinExec.java | 1 - .../physical/HashFullOuterJoinExec.java | 2 +- .../apache/tajo/engine/utils/CacheHolder.java | 14 +++-------- .../tajo/worker/TaskAttemptContext.java | 24 +++++++++++++++++++ .../java/org/apache/tajo/worker/TaskImpl.java | 7 ------ 6 files changed, 29 insertions(+), 21 deletions(-) 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 70d263b8b2..b04bdc4836 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 @@ -381,7 +381,7 @@ private PhysicalExec createInnerJoinPlan(TaskAttemptContext context, JoinNode pl */ @VisibleForTesting public PhysicalExec [] switchJoinSidesIfNecessary(TaskAttemptContext context, JoinNode plan, - PhysicalExec left, PhysicalExec right) throws IOException { + PhysicalExec left, PhysicalExec right) throws IOException { String [] leftLineage = PlannerUtil.getRelationLineage(plan.getLeftChild()); String [] rightLineage = PlannerUtil.getRelationLineage(plan.getRightChild()); long leftSize = estimateSizeRecursive(context, leftLineage); 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 2f51c99124..dc660f505b 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 @@ -18,7 +18,6 @@ package org.apache.tajo.engine.planner.physical; -import org.apache.tajo.algebra.JoinType; import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.engine.planner.KeyProjector; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java index c0a862247f..c463028090 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java @@ -130,7 +130,7 @@ protected TupleMap> convert(TupleMap hashed, TupleMap> tuples = new TupleMap>(hashed.size()); for (Map.Entry entry : hashed.entrySet()) { // flag: initially false (whether this join key had at least one match on the counter part) - tuples.putWihtoutKeyCopy(entry.getKey(), new Pair(false, entry.getValue())); + tuples.putWihtoutKeyCopy(entry.getKey(), new Pair<>(false, entry.getValue())); } return tuples; } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java index 05936be650..4fe4ddc94f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java @@ -78,18 +78,10 @@ public void release() { } public static TableCacheKey getCacheKey(TaskAttemptContext ctx, String canonicalName, - CatalogProtos.FragmentProto[] fragments) throws IOException { - String pathNameKey = ""; - if (fragments != null) { - StringBuilder stringBuilder = new StringBuilder(); - for (CatalogProtos.FragmentProto f : fragments) { - Fragment fragement = FragmentConvertor.convert(ctx.getConf(), f); - stringBuilder.append(fragement.getKey()); - } - pathNameKey = stringBuilder.toString(); - } + CatalogProtos.FragmentProto[] fragments) throws IOException { - return new TableCacheKey(ctx.getTaskId().getTaskId().getExecutionBlockId().toString(), canonicalName, pathNameKey); + return new TableCacheKey(ctx.getTaskId().getTaskId().getExecutionBlockId().toString(), canonicalName, + ctx.getUniqueKeyFromFragments()); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java index 5996118537..5a055d67e1 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java @@ -384,6 +384,30 @@ public String getUniqueKeyFromFragments() { return sb.toString(); } +// private static class FragmentProtoComparator implements Comparator { +// +// @Override +// public int compare(FragmentProto o1, FragmentProto o2) { +// +// } +// } + +// public static String getUniqueKeyFromFragments(FragmentProto[] fragments) { +// Arrays.sort(fragments); +// StringBuilder sb = new StringBuilder(); +// for (List fragments : fragmentMap.values()) { +// for (FragmentProto f : fragments) { +// FileFragment fileFragment = FragmentConvertor.convert(FileFragment.class, f); +// sb.append(fileFragment.getPath().getName()).append(fileFragment.getStartKey()).append(fileFragment.getLength()); +// } +// } +// return sb.toString(); +// } +// +// public static String getUniqueKeyFromFragments(List fragments) { +// return getUniqueKeyFromFragments(fragments.toArray(new FragmentProto[fragments.size()])); +// } + public int hashCode() { return Objects.hashCode(taskId); } diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java index 2366e4576e..7b8d06f992 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java @@ -57,7 +57,6 @@ import org.apache.tajo.rpc.NullCallback; import org.apache.tajo.storage.*; import org.apache.tajo.storage.fragment.FileFragment; -import org.apache.tajo.storage.fragment.FragmentConvertor; import org.apache.tajo.util.NetUtils; import java.io.File; @@ -155,12 +154,6 @@ public void initPlan() throws IOException { ", Fragments (num: " + request.getFragments().size() + ")" + ", Fetches (total:" + request.getFetches().size() + ") :"); - LOG.info("Fragments of " + getTaskContext().getTaskId()); - for (FragmentProto eachProto : request.getFragments()) { - FileFragment fragment = FragmentConvertor.convert(FileFragment.class, eachProto); - LOG.info(fragment.toString()); - } - if(LOG.isDebugEnabled()) { for (FetchImpl f : request.getFetches()) { LOG.debug("Table Id: " + f.getName() + ", Simple URIs: " + f.getSimpleURIs()); From ffb4bbeee5be08cf0536cc456b06c260d984a427 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 24 Aug 2015 16:54:35 +0900 Subject: [PATCH 16/18] Refine patch --- .../tajo/engine/query/TestCrossJoin.java | 73 +++++++- .../tajo/engine/query/TestInnerJoinQuery.java | 67 ------- .../testCrossJoinAndCaseWhen.sql | 0 .../testCrossJoinWithAsterisk1.sql | 0 .../testCrossJoinWithAsterisk2.sql | 0 .../testCrossJoinWithAsterisk3.sql | 0 .../testCrossJoinWithAsterisk4.sql | 0 .../testCrossJoin.1.Hash.plan | 0 .../testCrossJoin.1.Hash_NoBroadcast.plan | 0 .../testCrossJoin.1.Sort.plan | 0 .../testCrossJoin.1.Sort_NoBroadcast.plan | 0 .../testCrossJoin.1.result | 0 .../testCrossJoin.2.Hash.plan | 0 .../testCrossJoin.2.Hash_NoBroadcast.plan | 0 .../testCrossJoin.2.Sort.plan | 0 .../testCrossJoin.2.Sort_NoBroadcast.plan | 0 .../testCrossJoin.2.result | 0 .../testCrossJoin.3.Hash.plan | 0 .../testCrossJoin.3.Hash_NoBroadcast.plan | 0 .../testCrossJoin.3.Sort.plan | 0 .../testCrossJoin.3.Sort_NoBroadcast.plan | 0 .../testCrossJoin.3.result | 0 .../testCrossJoin.4.Hash.plan | 0 .../testCrossJoin.4.Hash_NoBroadcast.plan | 0 .../testCrossJoin.4.Sort.plan | 0 .../testCrossJoin.4.Sort_NoBroadcast.plan | 0 .../testCrossJoin.4.result | 0 .../testCrossJoin.5.Hash.plan | 0 .../testCrossJoin.5.Hash_NoBroadcast.plan | 0 .../testCrossJoin.5.Sort.plan | 0 .../testCrossJoin.5.Sort_NoBroadcast.plan | 0 .../testCrossJoin.5.result | 0 .../testCrossJoinAndCaseWhen.Hash.plan | 0 ...CrossJoinAndCaseWhen.Hash_NoBroadcast.plan | 0 .../testCrossJoinAndCaseWhen.Sort.plan | 0 ...CrossJoinAndCaseWhen.Sort_NoBroadcast.plan | 0 .../testCrossJoinAndCaseWhen.result | 0 .../testCrossJoinOfOneSmallTable.1.Hash.plan | 51 +++++ ...oinOfOneSmallTable.1.Hash_NoBroadcast.plan | 78 ++++++++ .../testCrossJoinOfOneSmallTable.1.Sort.plan | 51 +++++ ...oinOfOneSmallTable.1.Sort_NoBroadcast.plan | 78 ++++++++ .../testCrossJoinOfOneSmallTable.1.result | 127 +++++++++++++ ...rossJoinOfOneSmallTableAndJoin.1.Hash.plan | 89 +++++++++ ...eSmallTableAndJoin.1.Hash_NoBroadcast.plan | 174 ++++++++++++++++++ ...rossJoinOfOneSmallTableAndJoin.1.Sort.plan | 89 +++++++++ ...eSmallTableAndJoin.1.Sort_NoBroadcast.plan | 174 ++++++++++++++++++ ...stCrossJoinOfOneSmallTableAndJoin.1.result | 2 + .../testCrossJoinOftwoSmallTables.1.Hash.plan | 51 +++++ ...inOftwoSmallTables.1.Hash_NoBroadcast.plan | 78 ++++++++ .../testCrossJoinOftwoSmallTables.1.Sort.plan | 51 +++++ ...inOftwoSmallTables.1.Sort_NoBroadcast.plan | 78 ++++++++ .../testCrossJoinOftwoSmallTables.1.result | 27 +++ .../testCrossJoinWithAsterisk1.Hash.plan | 0 ...ossJoinWithAsterisk1.Hash_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk1.Sort.plan | 0 ...ossJoinWithAsterisk1.Sort_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk1.result | 0 .../testCrossJoinWithAsterisk2.Hash.plan | 0 ...ossJoinWithAsterisk2.Hash_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk2.Sort.plan | 0 ...ossJoinWithAsterisk2.Sort_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk2.result | 0 .../testCrossJoinWithAsterisk3.Hash.plan | 0 ...ossJoinWithAsterisk3.Hash_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk3.Sort.plan | 0 ...ossJoinWithAsterisk3.Sort_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk3.result | 0 .../testCrossJoinWithAsterisk4.Hash.plan | 0 ...ossJoinWithAsterisk4.Hash_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk4.Sort.plan | 0 ...ossJoinWithAsterisk4.Sort_NoBroadcast.plan | 0 .../testCrossJoinWithAsterisk4.result | 0 .../testCrossJoinWithEmptyTable1.Hash.plan | 0 ...sJoinWithEmptyTable1.Hash_NoBroadcast.plan | 0 .../testCrossJoinWithEmptyTable1.Sort.plan | 0 ...sJoinWithEmptyTable1.Sort_NoBroadcast.plan | 0 .../testCrossJoinWithEmptyTable1.result | 0 ...oinWithThetaJoinConditionInWhere.Hash.plan | 0 ...JoinConditionInWhere.Hash_NoBroadcast.plan | 0 ...oinWithThetaJoinConditionInWhere.Sort.plan | 0 ...JoinConditionInWhere.Sort_NoBroadcast.plan | 0 ...ssJoinWithThetaJoinConditionInWhere.result | 0 .../planner/physical/CommonHashJoinExec.java | 6 +- .../engine/planner/physical/HashJoinExec.java | 1 - .../apache/tajo/engine/utils/CacheHolder.java | 2 +- .../tajo/worker/TaskAttemptContext.java | 58 +++--- 86 files changed, 1305 insertions(+), 100 deletions(-) rename tajo-core-tests/src/test/resources/queries/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinAndCaseWhen.sql (100%) rename tajo-core-tests/src/test/resources/queries/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk1.sql (100%) rename tajo-core-tests/src/test/resources/queries/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk2.sql (100%) rename tajo-core-tests/src/test/resources/queries/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk3.sql (100%) rename tajo-core-tests/src/test/resources/queries/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk4.sql (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.1.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.1.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.1.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.1.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.1.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.2.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.2.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.2.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.2.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.2.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.3.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.3.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.3.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.3.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.3.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.4.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.4.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.4.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.4.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.4.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.5.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.5.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.5.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.5.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoin.5.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinAndCaseWhen.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinAndCaseWhen.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinAndCaseWhen.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinAndCaseWhen.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinAndCaseWhen.result (100%) create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash_NoBroadcast.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort_NoBroadcast.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.result create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash_NoBroadcast.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort_NoBroadcast.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.result create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash_NoBroadcast.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort_NoBroadcast.plan create mode 100644 tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.result rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk1.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk1.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk1.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk1.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk1.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk2.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk2.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk2.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk2.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk2.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk3.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk3.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk3.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk3.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk3.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk4.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk4.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk4.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk4.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithAsterisk4.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithEmptyTable1.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithEmptyTable1.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithEmptyTable1.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithEmptyTable1.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithEmptyTable1.result (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithThetaJoinConditionInWhere.Hash_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithThetaJoinConditionInWhere.Sort_NoBroadcast.plan (100%) rename tajo-core-tests/src/test/resources/results/{TestInnerJoinQuery => TestCrossJoin}/testCrossJoinWithThetaJoinConditionInWhere.result (100%) 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 index cfa54ada0f..7990ee7107 100644 --- 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 @@ -50,6 +50,73 @@ 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"); @@ -67,7 +134,7 @@ public final void testCrossJoinOfSubqueries() throws Exception { } @Test - @Option(withExplainGlobal = true, parameterized = true) + @Option(withExplain = true, withExplainGlobal = true, parameterized = true) @SimpleTest (queries = { @QuerySpec("select * from nation cross join region") }) @@ -76,7 +143,7 @@ public final void testCrossJoinOfOneSmallTable() throws Exception { } @Test - @Option(withExplainGlobal = true, parameterized = true) + @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") @@ -86,7 +153,7 @@ public final void testCrossJoinOfOneSmallTableAndJoin() throws Exception { } @Test - @Option(withExplainGlobal = true, parameterized = true) + @Option(withExplain = true, withExplainGlobal = true, parameterized = true) @SimpleTest (queries = { @QuerySpec("select * from lineitem cross join region") }) 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 88b35487e1..6ec828cbf1 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 @@ -49,27 +49,6 @@ 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, sort = true) - @SimpleTest() - public final void testCrossJoinWithThetaJoinConditionInWhere() throws Exception { - runSimpleTests(); - } - @Test @Option(withExplain = true, withExplainGlobal = true, parameterized = true) @SimpleTest() @@ -169,13 +148,6 @@ public final void testInnerJoinWithEmptyTable() 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(prepare = { @@ -287,45 +259,6 @@ public final void testNaturalJoin() 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) @SimpleTest() diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinAndCaseWhen.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinAndCaseWhen.sql similarity index 100% rename from tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinAndCaseWhen.sql rename to tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinAndCaseWhen.sql diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk1.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk1.sql similarity index 100% rename from tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk1.sql rename to tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk1.sql diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk2.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk2.sql similarity index 100% rename from tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk2.sql rename to tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk2.sql diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk3.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk3.sql similarity index 100% rename from tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk3.sql rename to tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk3.sql diff --git a/tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk4.sql b/tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk4.sql similarity index 100% rename from tajo-core-tests/src/test/resources/queries/TestInnerJoinQuery/testCrossJoinWithAsterisk4.sql rename to tajo-core-tests/src/test/resources/queries/TestCrossJoin/testCrossJoinWithAsterisk4.sql diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.1.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.2.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.3.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.3.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.4.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.4.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.5.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoin.5.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinAndCaseWhen.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinAndCaseWhen.result diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash.plan new file mode 100644 index 0000000000..1941c5ea2b --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash.plan @@ -0,0 +1,51 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_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)} +explain +------------------------------- +------------------------------------------------------------------------------- +Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004) +------------------------------------------------------------------------------- +|-eb_0000000000000_0000_000004 + |-eb_0000000000000_0000_000003 +------------------------------------------------------------------------------- +Order of Execution +------------------------------------------------------------------------------- +1: eb_0000000000000_0000_000003 +2: eb_0000000000000_0000_000004 +------------------------------------------------------------------------------- + +======================================================= +Block Id: eb_0000000000000_0000_000003 [ROOT] +======================================================= + +[Enforcers] + 0: type=Broadcast, tables=default.region + +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash_NoBroadcast.plan new file mode 100644 index 0000000000..579ff01805 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Hash_NoBroadcast.plan @@ -0,0 +1,78 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_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)} +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) + +SCAN(0) 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) + +SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE) + +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(8) on eb_0000000000000_0000_000002 + => out schema: {(3) default.region.r_comment (TEXT), 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(7) on eb_0000000000000_0000_000001 + => 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort.plan new file mode 100644 index 0000000000..1941c5ea2b --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort.plan @@ -0,0 +1,51 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_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)} +explain +------------------------------- +------------------------------------------------------------------------------- +Execution Block Graph (TERMINAL - eb_0000000000000_0000_000004) +------------------------------------------------------------------------------- +|-eb_0000000000000_0000_000004 + |-eb_0000000000000_0000_000003 +------------------------------------------------------------------------------- +Order of Execution +------------------------------------------------------------------------------- +1: eb_0000000000000_0000_000003 +2: eb_0000000000000_0000_000004 +------------------------------------------------------------------------------- + +======================================================= +Block Id: eb_0000000000000_0000_000003 [ROOT] +======================================================= + +[Enforcers] + 0: type=Broadcast, tables=default.region + +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort_NoBroadcast.plan new file mode 100644 index 0000000000..579ff01805 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.Sort_NoBroadcast.plan @@ -0,0 +1,78 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_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)} +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) + +SCAN(0) 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) + +SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE) + +JOIN(5)(CROSS) + => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(7) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(8) on eb_0000000000000_0000_000002 + => out schema: {(3) default.region.r_comment (TEXT), 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(7) on eb_0000000000000_0000_000001 + => 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.result new file mode 100644 index 0000000000..d3bd041735 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTable.1.result @@ -0,0 +1,127 @@ +n_nationkey,n_name,n_regionkey,n_comment,r_regionkey,r_name,r_comment +------------------------------- +0,ALGERIA,0, haggle. carefully final deposits detect slyly agai,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +0,ALGERIA,0, haggle. carefully final deposits detect slyly agai,1,AMERICA,hs use ironic, even requests. s +0,ALGERIA,0, haggle. carefully final deposits detect slyly agai,2,ASIA,ges. thinly even pinto beans ca +0,ALGERIA,0, haggle. carefully final deposits detect slyly agai,3,EUROPE,ly final courts cajole furiously final excuse +0,ALGERIA,0, haggle. carefully final deposits detect slyly agai,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon,1,AMERICA,hs use ironic, even requests. s +1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon,2,ASIA,ges. thinly even pinto beans ca +1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon,3,EUROPE,ly final courts cajole furiously final excuse +1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special ,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special ,1,AMERICA,hs use ironic, even requests. s +2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special ,2,ASIA,ges. thinly even pinto beans ca +2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special ,3,EUROPE,ly final courts cajole furiously final excuse +2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special ,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold,1,AMERICA,hs use ironic, even requests. s +3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold,2,ASIA,ges. thinly even pinto beans ca +3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold,3,EUROPE,ly final courts cajole furiously final excuse +3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d,1,AMERICA,hs use ironic, even requests. s +4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d,2,ASIA,ges. thinly even pinto beans ca +4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d,3,EUROPE,ly final courts cajole furiously final excuse +4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +5,ETHIOPIA,0,ven packages wake quickly. regu,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +5,ETHIOPIA,0,ven packages wake quickly. regu,1,AMERICA,hs use ironic, even requests. s +5,ETHIOPIA,0,ven packages wake quickly. regu,2,ASIA,ges. thinly even pinto beans ca +5,ETHIOPIA,0,ven packages wake quickly. regu,3,EUROPE,ly final courts cajole furiously final excuse +5,ETHIOPIA,0,ven packages wake quickly. regu,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +6,FRANCE,3,refully final requests. regular, ironi,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +6,FRANCE,3,refully final requests. regular, ironi,1,AMERICA,hs use ironic, even requests. s +6,FRANCE,3,refully final requests. regular, ironi,2,ASIA,ges. thinly even pinto beans ca +6,FRANCE,3,refully final requests. regular, ironi,3,EUROPE,ly final courts cajole furiously final excuse +6,FRANCE,3,refully final requests. regular, ironi,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco,1,AMERICA,hs use ironic, even requests. s +7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco,2,ASIA,ges. thinly even pinto beans ca +7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco,3,EUROPE,ly final courts cajole furiously final excuse +7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun,1,AMERICA,hs use ironic, even requests. s +8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun,2,ASIA,ges. thinly even pinto beans ca +8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun,3,EUROPE,ly final courts cajole furiously final excuse +8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull,1,AMERICA,hs use ironic, even requests. s +9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull,2,ASIA,ges. thinly even pinto beans ca +9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull,3,EUROPE,ly final courts cajole furiously final excuse +9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +10,IRAN,4,efully alongside of the slyly final dependencies. ,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +10,IRAN,4,efully alongside of the slyly final dependencies. ,1,AMERICA,hs use ironic, even requests. s +10,IRAN,4,efully alongside of the slyly final dependencies. ,2,ASIA,ges. thinly even pinto beans ca +10,IRAN,4,efully alongside of the slyly final dependencies. ,3,EUROPE,ly final courts cajole furiously final excuse +10,IRAN,4,efully alongside of the slyly final dependencies. ,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula,1,AMERICA,hs use ironic, even requests. s +11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula,2,ASIA,ges. thinly even pinto beans ca +11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula,3,EUROPE,ly final courts cajole furiously final excuse +11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +12,JAPAN,2,ously. final, express gifts cajole a,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +12,JAPAN,2,ously. final, express gifts cajole a,1,AMERICA,hs use ironic, even requests. s +12,JAPAN,2,ously. final, express gifts cajole a,2,ASIA,ges. thinly even pinto beans ca +12,JAPAN,2,ously. final, express gifts cajole a,3,EUROPE,ly final courts cajole furiously final excuse +12,JAPAN,2,ously. final, express gifts cajole a,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +13,JORDAN,4,ic deposits are blithely about the carefully regular pa,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +13,JORDAN,4,ic deposits are blithely about the carefully regular pa,1,AMERICA,hs use ironic, even requests. s +13,JORDAN,4,ic deposits are blithely about the carefully regular pa,2,ASIA,ges. thinly even pinto beans ca +13,JORDAN,4,ic deposits are blithely about the carefully regular pa,3,EUROPE,ly final courts cajole furiously final excuse +13,JORDAN,4,ic deposits are blithely about the carefully regular pa,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t,1,AMERICA,hs use ironic, even requests. s +14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t,2,ASIA,ges. thinly even pinto beans ca +14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t,3,EUROPE,ly final courts cajole furiously final excuse +14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?,1,AMERICA,hs use ironic, even requests. s +15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?,2,ASIA,ges. thinly even pinto beans ca +15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?,3,EUROPE,ly final courts cajole furiously final excuse +15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r,1,AMERICA,hs use ironic, even requests. s +16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r,2,ASIA,ges. thinly even pinto beans ca +16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r,3,EUROPE,ly final courts cajole furiously final excuse +16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun,1,AMERICA,hs use ironic, even requests. s +17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun,2,ASIA,ges. thinly even pinto beans ca +17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun,3,EUROPE,ly final courts cajole furiously final excuse +17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos,1,AMERICA,hs use ironic, even requests. s +18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos,2,ASIA,ges. thinly even pinto beans ca +18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos,3,EUROPE,ly final courts cajole furiously final excuse +18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account,1,AMERICA,hs use ironic, even requests. s +19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account,2,ASIA,ges. thinly even pinto beans ca +19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account,3,EUROPE,ly final courts cajole furiously final excuse +19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely,1,AMERICA,hs use ironic, even requests. s +20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely,2,ASIA,ges. thinly even pinto beans ca +20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely,3,EUROPE,ly final courts cajole furiously final excuse +20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +21,VIETNAM,2,hely enticingly express accounts. even, final ,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +21,VIETNAM,2,hely enticingly express accounts. even, final ,1,AMERICA,hs use ironic, even requests. s +21,VIETNAM,2,hely enticingly express accounts. even, final ,2,ASIA,ges. thinly even pinto beans ca +21,VIETNAM,2,hely enticingly express accounts. even, final ,3,EUROPE,ly final courts cajole furiously final excuse +21,VIETNAM,2,hely enticingly express accounts. even, final ,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint,1,AMERICA,hs use ironic, even requests. s +22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint,2,ASIA,ges. thinly even pinto beans ca +22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint,3,EUROPE,ly final courts cajole furiously final excuse +22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull,1,AMERICA,hs use ironic, even requests. s +23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull,2,ASIA,ges. thinly even pinto beans ca +23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull,3,EUROPE,ly final courts cajole furiously final excuse +23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be,1,AMERICA,hs use ironic, even requests. s +24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be,2,ASIA,ges. thinly even pinto beans ca +24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be,3,EUROPE,ly final courts cajole furiously final excuse +24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash.plan new file mode 100644 index 0000000000..54d2e62b06 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash.plan @@ -0,0 +1,89 @@ +explain +------------------------------- +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(0) 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)} + JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(5) 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)} + JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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)} +explain +------------------------------- +------------------------------------------------------------------------------- +Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008) +------------------------------------------------------------------------------- +|-eb_0000000000000_0000_000008 + |-eb_0000000000000_0000_000007 +------------------------------------------------------------------------------- +Order of Execution +------------------------------------------------------------------------------- +1: eb_0000000000000_0000_000007 +2: eb_0000000000000_0000_000008 +------------------------------------------------------------------------------- + +======================================================= +Block Id: eb_0000000000000_0000_000007 [ROOT] +======================================================= + +[Enforcers] + 0: type=Broadcast, tables=default.supplier + 1: type=Broadcast, tables=default.region + 2: type=Broadcast, tables=default.orders + +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(0) 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)} + JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(5) 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)} + JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash_NoBroadcast.plan new file mode 100644 index 0000000000..7416392fb7 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Hash_NoBroadcast.plan @@ -0,0 +1,174 @@ +explain +------------------------------- +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(0) 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)} + JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(5) 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)} + JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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)} +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.region.r_regionkey (INT4), num=32) + +SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_000002 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32) + +SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region.r_regionkey (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_suppkey (INT4), num=32) + +JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(14) on eb_0000000000000_0000_000002 + => out 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)} + => 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(13) on eb_0000000000000_0000_000001 + => out schema: {(3) default.region.r_comment (TEXT), 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_000004 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32) + +SCAN(5) 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_000005 [INTERMEDIATE] +======================================================= + +[Incoming] +[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32) +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32) + +[Outgoing] +[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE) + +JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(16) on eb_0000000000000_0000_000004 + => 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(15) on eb_0000000000000_0000_000003 + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + +======================================================= +Block Id: eb_0000000000000_0000_000006 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE) + +SCAN(0) 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_000007 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE) + +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(18) on eb_0000000000000_0000_000006 + => 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(17) on eb_0000000000000_0000_000005 + => out schema: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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)} + +======================================================= +Block Id: eb_0000000000000_0000_000008 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort.plan new file mode 100644 index 0000000000..54d2e62b06 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort.plan @@ -0,0 +1,89 @@ +explain +------------------------------- +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(0) 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)} + JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(5) 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)} + JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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)} +explain +------------------------------- +------------------------------------------------------------------------------- +Execution Block Graph (TERMINAL - eb_0000000000000_0000_000008) +------------------------------------------------------------------------------- +|-eb_0000000000000_0000_000008 + |-eb_0000000000000_0000_000007 +------------------------------------------------------------------------------- +Order of Execution +------------------------------------------------------------------------------- +1: eb_0000000000000_0000_000007 +2: eb_0000000000000_0000_000008 +------------------------------------------------------------------------------- + +======================================================= +Block Id: eb_0000000000000_0000_000007 [ROOT] +======================================================= + +[Enforcers] + 0: type=Broadcast, tables=default.supplier + 1: type=Broadcast, tables=default.region + 2: type=Broadcast, tables=default.orders + +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(0) 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)} + JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(5) 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)} + JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort_NoBroadcast.plan new file mode 100644 index 0000000000..7416392fb7 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.Sort_NoBroadcast.plan @@ -0,0 +1,174 @@ +explain +------------------------------- +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(0) 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)} + JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(5) 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)} + JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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)} +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.region.r_regionkey (INT4), num=32) + +SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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_000002 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE, key=default.lineitem.l_orderkey (INT4), num=32) + +SCAN(3) on default.lineitem + => target list: 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) + => out 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)} + => 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.region.r_regionkey (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_suppkey (INT4), num=32) + +JOIN(9)(LEFT_OUTER) + => Join Cond: default.region.r_regionkey (INT4) = default.lineitem.l_orderkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(14) on eb_0000000000000_0000_000002 + => out 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)} + => 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(13) on eb_0000000000000_0000_000001 + => out schema: {(3) default.region.r_comment (TEXT), 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_000004 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32) + +SCAN(5) 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_000005 [INTERMEDIATE] +======================================================= + +[Incoming] +[q_0000000000000_0000] 3 => 5 (type=HASH_SHUFFLE, key=default.lineitem.l_suppkey (INT4), num=32) +[q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.supplier.s_suppkey (INT4), num=32) + +[Outgoing] +[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE) + +JOIN(10)(INNER) + => Join Cond: default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(16) on eb_0000000000000_0000_000004 + => 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(15) on eb_0000000000000_0000_000003 + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + +======================================================= +Block Id: eb_0000000000000_0000_000006 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE) + +SCAN(0) 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_000007 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 5 => 7 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE) + +JOIN(11)(CROSS) + => target list: 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(35) 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), 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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(18) on eb_0000000000000_0000_000006 + => 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(17) on eb_0000000000000_0000_000005 + => out schema: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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: {(26) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_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)} + +======================================================= +Block Id: eb_0000000000000_0000_000008 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.result new file mode 100644 index 0000000000..e50347eb02 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOfOneSmallTableAndJoin.1.result @@ -0,0 +1,2 @@ +o_orderkey,o_custkey,o_orderstatus,o_totalprice,o_orderdate,o_orderpriority,o_clerk,o_shippriority,o_comment,r_regionkey,r_name,r_comment,l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment,s_suppkey,s_name,s_address,s_nationkey,s_phone,s_acctbal,s_comment +------------------------------- diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash.plan new file mode 100644 index 0000000000..080fb9a11e --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash.plan @@ -0,0 +1,51 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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.lineitem + => target list: 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) + => out 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)} + => 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 +------------------------------------------------------------------------------- +Order of Execution +------------------------------------------------------------------------------- +1: eb_0000000000000_0000_000003 +2: eb_0000000000000_0000_000004 +------------------------------------------------------------------------------- + +======================================================= +Block Id: eb_0000000000000_0000_000003 [ROOT] +======================================================= + +[Enforcers] + 0: type=Broadcast, tables=default.region + +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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.lineitem + => target list: 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) + => out 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)} + => 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash_NoBroadcast.plan new file mode 100644 index 0000000000..ffe2e5c018 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Hash_NoBroadcast.plan @@ -0,0 +1,78 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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.lineitem + => target list: 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) + => out 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)} + => 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) + +SCAN(0) on default.lineitem + => target list: 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) + => out 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)} + => 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) + +SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE) + +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(8) on eb_0000000000000_0000_000002 + => out schema: {(3) default.region.r_comment (TEXT), 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(7) on eb_0000000000000_0000_000001 + => out 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)} + => 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort.plan new file mode 100644 index 0000000000..080fb9a11e --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort.plan @@ -0,0 +1,51 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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.lineitem + => target list: 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) + => out 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)} + => 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 +------------------------------------------------------------------------------- +Order of Execution +------------------------------------------------------------------------------- +1: eb_0000000000000_0000_000003 +2: eb_0000000000000_0000_000004 +------------------------------------------------------------------------------- + +======================================================= +Block Id: eb_0000000000000_0000_000003 [ROOT] +======================================================= + +[Enforcers] + 0: type=Broadcast, tables=default.region + +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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.lineitem + => target list: 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) + => out 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)} + => 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort_NoBroadcast.plan new file mode 100644 index 0000000000..ffe2e5c018 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.Sort_NoBroadcast.plan @@ -0,0 +1,78 @@ +explain +------------------------------- +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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.lineitem + => target list: 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) + => out 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)} + => 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) + +SCAN(0) on default.lineitem + => target list: 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) + => out 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)} + => 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) + +SCAN(1) on default.region + => target list: default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(3) default.region.r_comment (TEXT), 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 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE) + +JOIN(5)(CROSS) + => target list: 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) + => out schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + => in schema: {(19) 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), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} + SCAN(8) on eb_0000000000000_0000_000002 + => out schema: {(3) default.region.r_comment (TEXT), 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(7) on eb_0000000000000_0000_000001 + => out 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)} + => 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 [TERMINAL] +======================================================= diff --git a/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.result new file mode 100644 index 0000000000..d2b414ab35 --- /dev/null +++ b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinOftwoSmallTables.1.result @@ -0,0 +1,27 @@ +l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment,r_regionkey,r_name,r_comment +------------------------------- +1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the,1,AMERICA,hs use ironic, even requests. s +1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the,2,ASIA,ges. thinly even pinto beans ca +1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the,3,EUROPE,ly final courts cajole furiously final excuse +1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +1,1,7311,2,36.0,45983.16,0.09,0.06,N,O,1996-04-12,1996-02-28,1996-04-20,TAKE BACK RETURN,MAIL,ly final dependencies: slyly bold ,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +1,1,7311,2,36.0,45983.16,0.09,0.06,N,O,1996-04-12,1996-02-28,1996-04-20,TAKE BACK RETURN,MAIL,ly final dependencies: slyly bold ,1,AMERICA,hs use ironic, even requests. s +1,1,7311,2,36.0,45983.16,0.09,0.06,N,O,1996-04-12,1996-02-28,1996-04-20,TAKE BACK RETURN,MAIL,ly final dependencies: slyly bold ,2,ASIA,ges. thinly even pinto beans ca +1,1,7311,2,36.0,45983.16,0.09,0.06,N,O,1996-04-12,1996-02-28,1996-04-20,TAKE BACK RETURN,MAIL,ly final dependencies: slyly bold ,3,EUROPE,ly final courts cajole furiously final excuse +1,1,7311,2,36.0,45983.16,0.09,0.06,N,O,1996-04-12,1996-02-28,1996-04-20,TAKE BACK RETURN,MAIL,ly final dependencies: slyly bold ,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +2,2,1191,1,38.0,44694.46,0.0,0.05,N,O,1997-01-28,1997-01-14,1997-02-02,TAKE BACK RETURN,RAIL,ven requests. deposits breach a,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +2,2,1191,1,38.0,44694.46,0.0,0.05,N,O,1997-01-28,1997-01-14,1997-02-02,TAKE BACK RETURN,RAIL,ven requests. deposits breach a,1,AMERICA,hs use ironic, even requests. s +2,2,1191,1,38.0,44694.46,0.0,0.05,N,O,1997-01-28,1997-01-14,1997-02-02,TAKE BACK RETURN,RAIL,ven requests. deposits breach a,2,ASIA,ges. thinly even pinto beans ca +2,2,1191,1,38.0,44694.46,0.0,0.05,N,O,1997-01-28,1997-01-14,1997-02-02,TAKE BACK RETURN,RAIL,ven requests. deposits breach a,3,EUROPE,ly final courts cajole furiously final excuse +2,2,1191,1,38.0,44694.46,0.0,0.05,N,O,1997-01-28,1997-01-14,1997-02-02,TAKE BACK RETURN,RAIL,ven requests. deposits breach a,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +3,2,1798,1,45.0,54058.05,0.06,0.0,R,F,1994-02-02,1994-01-04,1994-02-23,NONE,AIR,ongside of the furiously brave acco,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +3,2,1798,1,45.0,54058.05,0.06,0.0,R,F,1994-02-02,1994-01-04,1994-02-23,NONE,AIR,ongside of the furiously brave acco,1,AMERICA,hs use ironic, even requests. s +3,2,1798,1,45.0,54058.05,0.06,0.0,R,F,1994-02-02,1994-01-04,1994-02-23,NONE,AIR,ongside of the furiously brave acco,2,ASIA,ges. thinly even pinto beans ca +3,2,1798,1,45.0,54058.05,0.06,0.0,R,F,1994-02-02,1994-01-04,1994-02-23,NONE,AIR,ongside of the furiously brave acco,3,EUROPE,ly final courts cajole furiously final excuse +3,2,1798,1,45.0,54058.05,0.06,0.0,R,F,1994-02-02,1994-01-04,1994-02-23,NONE,AIR,ongside of the furiously brave acco,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +3,3,6540,2,49.0,46796.47,0.1,0.0,R,F,1993-11-09,1993-12-20,1993-11-24,TAKE BACK RETURN,RAIL, unusual accounts. eve,0,AFRICA,lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +3,3,6540,2,49.0,46796.47,0.1,0.0,R,F,1993-11-09,1993-12-20,1993-11-24,TAKE BACK RETURN,RAIL, unusual accounts. eve,1,AMERICA,hs use ironic, even requests. s +3,3,6540,2,49.0,46796.47,0.1,0.0,R,F,1993-11-09,1993-12-20,1993-11-24,TAKE BACK RETURN,RAIL, unusual accounts. eve,2,ASIA,ges. thinly even pinto beans ca +3,3,6540,2,49.0,46796.47,0.1,0.0,R,F,1993-11-09,1993-12-20,1993-11-24,TAKE BACK RETURN,RAIL, unusual accounts. eve,3,EUROPE,ly final courts cajole furiously final excuse +3,3,6540,2,49.0,46796.47,0.1,0.0,R,F,1993-11-09,1993-12-20,1993-11-24,TAKE BACK RETURN,RAIL, unusual accounts. eve,4,MIDDLE EAST,uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk1.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk1.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk2.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk2.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk3.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk3.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithAsterisk4.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithAsterisk4.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithEmptyTable1.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithEmptyTable1.result diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Hash.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Hash_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Hash_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Hash_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Sort.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort_NoBroadcast.plan b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Sort_NoBroadcast.plan similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.Sort_NoBroadcast.plan rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.Sort_NoBroadcast.plan diff --git a/tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.result b/tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.result similarity index 100% rename from tajo-core-tests/src/test/resources/results/TestInnerJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.result rename to tajo-core-tests/src/test/resources/results/TestCrossJoin/testCrossJoinWithThetaJoinConditionInWhere.result 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 dc660f505b..264527b3b2 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 @@ -60,6 +60,8 @@ public abstract class CommonHashJoinExec extends CommonJoinExec { protected boolean finished; + protected TableStats tableStatsOfCachedRightChild = null; + public CommonHashJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec outer, PhysicalExec inner) { super(context, plan, outer, inner); @@ -131,6 +133,7 @@ protected void loadRightFromCache(TableCacheKey key) throws IOException { sharedResource.addBroadcastCache(key, holder); } } + this.tableStatsOfCachedRightChild = holder.getTableStats(); this.tupleSlots = convert(holder.getData(), true); } @@ -208,7 +211,8 @@ public TableStats getInputStats() { inputStats.setNumRows(leftInputStats.getNumRows()); } - TableStats rightInputStats = rightChild.getInputStats(); + TableStats rightInputStats = tableStatsOfCachedRightChild == null ? + rightChild.getInputStats() : tableStatsOfCachedRightChild; if (rightInputStats != null) { inputStats.setNumBytes(inputStats.getNumBytes() + rightInputStats.getNumBytes()); inputStats.setReadBytes(inputStats.getReadBytes() + rightInputStats.getReadBytes()); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java index e4e4216440..cca3548659 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java @@ -36,7 +36,6 @@ public HashJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec left protected TupleMap convert(TupleMap hashed, boolean fromCache) throws IOException { return fromCache ? new TupleMap(hashed) : hashed; -// return hashed; } @Override diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java index 4fe4ddc94f..cfb880ee01 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java @@ -81,7 +81,7 @@ public static TableCacheKey getCacheKey(TaskAttemptContext ctx, String canonical CatalogProtos.FragmentProto[] fragments) throws IOException { return new TableCacheKey(ctx.getTaskId().getTaskId().getExecutionBlockId().toString(), canonicalName, - ctx.getUniqueKeyFromFragments()); + TaskAttemptContext.getUniqueKeyFromFragments(fragments)); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java index 5a055d67e1..0ab25a1c39 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java @@ -374,39 +374,43 @@ public Collection getInputTables() { } public String getUniqueKeyFromFragments() { - StringBuilder sb = new StringBuilder(); + List allFragments = TUtil.newList(); + for (List fragments : fragmentMap.values()) { + allFragments.addAll(fragments); + } + return getUniqueKeyFromFragments(allFragments); + } + + private static class FileFragmentComparator implements Comparator { + + @Override + public int compare(FragmentProto o1, FragmentProto o2) { + FileFragment f1 = FragmentConvertor.convert(FileFragment.class, o1); + FileFragment f2 = FragmentConvertor.convert(FileFragment.class, o2); + return f1.compareTo(f2); + } + } + + private final static FileFragmentComparator fileFragmentComparator = new FileFragmentComparator(); + + public static String getUniqueKeyFromFragments(FragmentProto[] fragments) { + if (fragments == null) { + return ""; + } else { + Arrays.sort(fragments, fileFragmentComparator); + StringBuilder sb = new StringBuilder(); for (FragmentProto f : fragments) { FileFragment fileFragment = FragmentConvertor.convert(FileFragment.class, f); sb.append(fileFragment.getPath().getName()).append(fileFragment.getStartKey()).append(fileFragment.getLength()); } + return sb.toString(); } - return sb.toString(); - } - -// private static class FragmentProtoComparator implements Comparator { -// -// @Override -// public int compare(FragmentProto o1, FragmentProto o2) { -// -// } -// } - -// public static String getUniqueKeyFromFragments(FragmentProto[] fragments) { -// Arrays.sort(fragments); -// StringBuilder sb = new StringBuilder(); -// for (List fragments : fragmentMap.values()) { -// for (FragmentProto f : fragments) { -// FileFragment fileFragment = FragmentConvertor.convert(FileFragment.class, f); -// sb.append(fileFragment.getPath().getName()).append(fileFragment.getStartKey()).append(fileFragment.getLength()); -// } -// } -// return sb.toString(); -// } -// -// public static String getUniqueKeyFromFragments(List fragments) { -// return getUniqueKeyFromFragments(fragments.toArray(new FragmentProto[fragments.size()])); -// } + } + + public static String getUniqueKeyFromFragments(List fragments) { + return getUniqueKeyFromFragments(fragments.toArray(new FragmentProto[fragments.size()])); + } public int hashCode() { return Objects.hashCode(taskId); From b233fff0cb0d11d018d19c0fc6517c13f00d8681 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 24 Aug 2015 20:46:38 +0900 Subject: [PATCH 17/18] Improved unique key generation --- .../org/apache/tajo/benchmark/TestTPCH.java | 12 ---- .../planner/physical/BSTIndexScanExec.java | 26 ++++++- .../BasicPhysicalExecutorVisitor.java | 11 ++- .../planner/physical/CommonHashJoinExec.java | 3 +- .../planner/physical/IndexExecutorUtil.java | 15 ++++ .../physical/PartitionMergeScanExec.java | 5 ++ .../physical/PhysicalExecutorVisitor.java | 3 + .../engine/planner/physical/ScanExec.java | 3 + .../engine/planner/physical/SeqScanExec.java | 5 ++ .../planner/physical/StoreIndexExec.java | 10 ++- .../apache/tajo/engine/utils/CacheHolder.java | 8 +-- .../tajo/worker/TaskAttemptContext.java | 42 ++--------- .../rewrite/rules/FilterPushDownRule.java | 3 +- .../org/apache/tajo/plan/util/IndexUtil.java | 72 ------------------- .../apache/tajo/plan/util/PlannerUtil.java | 6 ++ 15 files changed, 92 insertions(+), 132 deletions(-) create mode 100644 tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java delete mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/util/IndexUtil.java diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java b/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java index 04c98677b5..53d43504ba 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/benchmark/TestTPCH.java @@ -65,16 +65,4 @@ public void testTPCHQ5() throws Exception { public void testFirstJoinInQ7() throws Exception { runSimpleTests(); } - - @Test - public void testMelon() throws Exception { - try { - executeString("create table partitioned_lineitem (l_orderkey int8, l_partkey int8, l_suppkey int8, l_linenumber int8, l_quantity float8, l_extendedprice float8, l_discount float8, l_tax float8, l_linestatus text, l_shipdate text, l_commitdate text, l_receiptdate text, l_shipinstruct text, l_shipmode text, l_comment text) partition by column (l_returnflag text) as select l_orderkey, l_partkey, l_suppkey, l_linenumber , l_quantity , l_extendedprice , l_discount , l_tax , l_linestatus , l_shipdate , l_commitdate , l_receiptdate , l_shipinstruct , l_shipmode , l_comment, l_returnflag from lineitem"); - - executeString("select l_linenumber, sum(sum_val) from ( select l_linenumber, sum(l_discount) sum_val from (select l_linenumber, l_discount, s_nationkey from partitioned_lineitem a1 left outer join supplier a2 on s_suppkey = l_suppkey where a2.s_suppkey is not null) t1 inner join nation t2 on t2.n_nationkey = t1.s_nationkey group by l_linenumber union select l_linenumber, sum(l_discount) sum_val from (select l_linenumber, l_discount, s_nationkey from partitioned_lineitem a1 left outer join supplier a2 on s_suppkey = l_suppkey where a2.s_suppkey is not null) t3 inner join nation t4 on t4.n_nationkey = t3.s_nationkey group by l_linenumber ) sx_std group by l_linenumber;"); - } finally { - executeString("drop table partitioned_lineitem purge"); - - } - } } \ No newline at end of file diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java index a59960fb2a..e1713387b0 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java @@ -24,6 +24,7 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.SortSpec; import org.apache.tajo.catalog.proto.CatalogProtos; +import org.apache.tajo.catalog.proto.CatalogProtos.FragmentProto; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.datum.Datum; import org.apache.tajo.engine.planner.Projector; @@ -31,6 +32,7 @@ import org.apache.tajo.plan.expr.EvalNode; import org.apache.tajo.plan.expr.EvalTreeUtil; import org.apache.tajo.plan.logical.IndexScanNode; +import org.apache.tajo.plan.logical.ScanNode; import org.apache.tajo.plan.rewrite.rules.IndexScanInfo.SimplePredicate; import org.apache.tajo.storage.*; import org.apache.tajo.storage.index.bst.BSTIndex; @@ -42,7 +44,7 @@ import java.util.HashSet; import java.util.Set; -public class BSTIndexScanExec extends PhysicalExec { +public class BSTIndexScanExec extends ScanExec { private IndexScanNode plan; private SeekableScanner fileScanner; @@ -85,7 +87,7 @@ public BSTIndexScanExec(TaskAttemptContext context, IndexScanNode plan, this.projector = new Projector(context, inSchema, outSchema, plan.getTargets()); - Path indexPath = new Path(indexPrefix.toString(), context.getUniqueKeyFromFragments()); + Path indexPath = new Path(indexPrefix.toString(), IndexExecutorUtil.getIndexFileName(fragment)); this.reader = new BSTIndex(context.getConf()). getIndexReader(indexPath, keySchema, comparator); this.reader.open(); @@ -108,6 +110,21 @@ private static Schema mergeSubSchemas(Schema originalSchema, Schema subSchema, T return mergedSchema; } + @Override + public String getTableName() { + return plan.getTableName(); + } + + @Override + public String getCanonicalName() { + return plan.getCanonicalName(); + } + + @Override + public FragmentProto[] getFragments() { + return new FragmentProto[]{fragment}; + } + @Override public void init() throws IOException { Schema projected; @@ -151,6 +168,11 @@ public void init() throws IOException { } } + @Override + public ScanNode getScanNode() { + return plan; + } + private void initScanner(Schema projected) throws IOException { // Why we should check nullity? See https://issues.apache.org/jira/browse/TAJO-1422 diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java index b591b279e4..62af4e1b63 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BasicPhysicalExecutorVisitor.java @@ -77,6 +77,8 @@ public RESULT visit(PhysicalExec exec, Stack stack, CONTEXT contex return visitSortBasedColPartitionStore(context, (SortBasedColPartitionStoreExec) exec, stack); } else if (exec instanceof StoreTableExec) { return visitStoreTable(context, (StoreTableExec) exec, stack); + } else if (exec instanceof StoreIndexExec) { + return visitStoreIndex(context, (StoreIndexExec) exec, stack); } throw new PhysicalPlanningException("Unsupported Type: " + exec.getClass().getSimpleName()); @@ -237,7 +239,14 @@ public RESULT visitSortBasedColPartitionStore(CONTEXT context, SortBasedColParti } @Override - public RESULT visitStoreTable(CONTEXT context, StoreTableExec exec, Stack stack) throws PhysicalPlanningException { + public RESULT visitStoreTable(CONTEXT context, StoreTableExec exec, Stack stack) + throws PhysicalPlanningException { + return visitUnaryExecutor(context, exec, stack); + } + + @Override + public RESULT visitStoreIndex(CONTEXT context, StoreIndexExec exec, Stack stack) + throws PhysicalPlanningException { return visitUnaryExecutor(context, exec, stack); } } 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 264527b3b2..a248d52595 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 @@ -110,8 +110,7 @@ protected void loadRightToHashTable() throws IOException { ScanExec scanExec = PhysicalPlanUtil.findExecutor(rightChild, ScanExec.class); if (scanExec.canBroadcast()) { /* If this table can broadcast, all tasks in a node will share the same cache */ - TableCacheKey key = CacheHolder.BroadcastCacheHolder.getCacheKey( - context, scanExec.getCanonicalName(), scanExec.getFragments()); + TableCacheKey key = CacheHolder.BroadcastCacheHolder.getCacheKey(context, scanExec); loadRightFromCache(key); } else { this.tupleSlots = convert(buildRightToHashTable(), false); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java new file mode 100644 index 0000000000..9c8bc457a5 --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java @@ -0,0 +1,15 @@ +package org.apache.tajo.engine.planner.physical; + +import org.apache.tajo.catalog.proto.CatalogProtos.FragmentProto; +import org.apache.tajo.storage.fragment.FileFragment; +import org.apache.tajo.storage.fragment.FragmentConvertor; + +public class IndexExecutorUtil { + + public static String getIndexFileName(FragmentProto fragmentProto) { + FileFragment fileFragment = FragmentConvertor.convert(FileFragment.class, fragmentProto); + StringBuilder sb = new StringBuilder(); + sb.append(fileFragment.getPath().getName()).append(fileFragment.getStartKey()).append(fileFragment.getLength()); + return sb.toString(); + } +} diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PartitionMergeScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PartitionMergeScanExec.java index c1a451acea..2b6191e5a6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PartitionMergeScanExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PartitionMergeScanExec.java @@ -68,6 +68,11 @@ public void init() throws IOException { super.init(); } + @Override + public ScanNode getScanNode() { + return plan; + } + private void initScanExecutors() throws IOException { if (scanners.size() > 0) { iterator = scanners.iterator(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java index 86d8b7dea6..554c31eb41 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalExecutorVisitor.java @@ -97,4 +97,7 @@ RESULT visitSortBasedColPartitionStore(CONTEXT context, SortBasedColPartitionSto RESULT visitStoreTable(CONTEXT context, StoreTableExec exec, Stack stack) throws PhysicalPlanningException; + + RESULT visitStoreIndex(CONTEXT context, StoreIndexExec exec, Stack stack) + throws PhysicalPlanningException; } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ScanExec.java index 5cca4c59bc..45379bbd10 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ScanExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ScanExec.java @@ -21,6 +21,7 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.engine.planner.enforce.Enforcer; +import org.apache.tajo.plan.logical.ScanNode; import org.apache.tajo.plan.serder.PlanProto.EnforceProperty; import org.apache.tajo.worker.TaskAttemptContext; @@ -49,6 +50,8 @@ public void init() throws IOException { super.init(); } + public abstract ScanNode getScanNode(); + public boolean canBroadcast() { return canBroadcast; } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java index b49fa40868..1ecabf123f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java @@ -210,6 +210,11 @@ public void init() throws IOException { super.init(); } + @Override + public ScanNode getScanNode() { + return plan; + } + @Override protected void compile() throws CompilationError { if (plan.hasQual()) { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreIndexExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreIndexExec.java index f9db842534..fed1d5cecf 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreIndexExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreIndexExec.java @@ -27,6 +27,7 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.SortSpec; import org.apache.tajo.conf.TajoConf; +import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.plan.logical.CreateIndexNode; import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.storage.*; @@ -65,8 +66,15 @@ public void init() throws IOException { indexKeys[i] = inSchema.getColumnId(col.getQualifiedName()); } + // TODO: this line should be improved to allow multiple scan executors. + ScanExec scanExec = PhysicalPlanUtil.findExecutor(this, ScanExec.class); + if (scanExec == null) { + throw new TajoInternalError("Cannot find scan executors."); + } + TajoConf conf = context.getConf(); - Path indexPath = new Path(logicalPlan.getIndexPath().toString(), context.getUniqueKeyFromFragments()); + Path indexPath = new Path(logicalPlan.getIndexPath().toString(), + IndexExecutorUtil.getIndexFileName(scanExec.getFragments()[0])); // TODO: Create factory using reflection BSTIndex bst = new BSTIndex(conf); this.comparator = new BaseTupleComparator(keySchema, sortSpecs); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java index cfb880ee01..b1a521bda8 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java @@ -20,6 +20,7 @@ import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.catalog.statistics.TableStats; +import org.apache.tajo.engine.planner.physical.ScanExec; import org.apache.tajo.engine.planner.physical.TupleList; import org.apache.tajo.engine.planner.physical.TupleMap; import org.apache.tajo.storage.fragment.Fragment; @@ -77,11 +78,10 @@ public void release() { if(rowBlock != null) rowBlock.release(); } - public static TableCacheKey getCacheKey(TaskAttemptContext ctx, String canonicalName, - CatalogProtos.FragmentProto[] fragments) throws IOException { + public static TableCacheKey getCacheKey(TaskAttemptContext ctx, ScanExec scanExec) throws IOException { - return new TableCacheKey(ctx.getTaskId().getTaskId().getExecutionBlockId().toString(), canonicalName, - TaskAttemptContext.getUniqueKeyFromFragments(fragments)); + return new TableCacheKey(ctx.getTaskId().getTaskId().getExecutionBlockId().toString(), + scanExec.getCanonicalName(), TaskAttemptContext.getUniqueKeyFromFragments(ctx, scanExec)); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java index 0ab25a1c39..d251a9262d 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.Path; +import org.apache.tajo.QueryId; import org.apache.tajo.TajoProtos.TaskAttemptState; import org.apache.tajo.TaskAttemptId; import org.apache.tajo.catalog.Schema; @@ -32,6 +33,7 @@ import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.planner.enforce.Enforcer; import org.apache.tajo.engine.planner.global.DataChannel; +import org.apache.tajo.engine.planner.physical.ScanExec; import org.apache.tajo.engine.query.QueryContext; import org.apache.tajo.plan.expr.EvalContext; import org.apache.tajo.plan.expr.EvalNode; @@ -373,43 +375,11 @@ public Collection getInputTables() { return fragmentMap.get(id).toArray(new FragmentProto[fragmentMap.get(id).size()]); } - public String getUniqueKeyFromFragments() { - List allFragments = TUtil.newList(); + public static String getUniqueKeyFromFragments(TaskAttemptContext context, ScanExec scanExec) { + QueryId queryId = context.taskId.getTaskId().getExecutionBlockId().getQueryId(); + int pid = scanExec.getScanNode().getPID(); - for (List fragments : fragmentMap.values()) { - allFragments.addAll(fragments); - } - return getUniqueKeyFromFragments(allFragments); - } - - private static class FileFragmentComparator implements Comparator { - - @Override - public int compare(FragmentProto o1, FragmentProto o2) { - FileFragment f1 = FragmentConvertor.convert(FileFragment.class, o1); - FileFragment f2 = FragmentConvertor.convert(FileFragment.class, o2); - return f1.compareTo(f2); - } - } - - private final static FileFragmentComparator fileFragmentComparator = new FileFragmentComparator(); - - public static String getUniqueKeyFromFragments(FragmentProto[] fragments) { - if (fragments == null) { - return ""; - } else { - Arrays.sort(fragments, fileFragmentComparator); - StringBuilder sb = new StringBuilder(); - for (FragmentProto f : fragments) { - FileFragment fileFragment = FragmentConvertor.convert(FileFragment.class, f); - sb.append(fileFragment.getPath().getName()).append(fileFragment.getStartKey()).append(fileFragment.getLength()); - } - return sb.toString(); - } - } - - public static String getUniqueKeyFromFragments(List fragments) { - return getUniqueKeyFromFragments(fragments.toArray(new FragmentProto[fragments.size()])); + return queryId.toString() + pid; } public int hashCode() { 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 419b3e5494..83bb700b7a 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 @@ -39,7 +39,6 @@ import org.apache.tajo.plan.rewrite.LogicalPlanRewriteRuleContext; import org.apache.tajo.plan.rewrite.rules.FilterPushDownRule.FilterPushDownContext; import org.apache.tajo.plan.rewrite.rules.IndexScanInfo.SimplePredicate; -import org.apache.tajo.plan.util.IndexUtil; import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor; import org.apache.tajo.util.TUtil; @@ -965,7 +964,7 @@ public LogicalNode visitScan(FilterPushDownContext context, LogicalPlan plan, databaseName = CatalogUtil.extractQualifier(table.getName()); tableName = CatalogUtil.extractSimpleName(table.getName()); Set predicates = TUtil.newHashSet(); - for (EvalNode eval : IndexUtil.getAllEqualEvals(qual)) { + for (EvalNode eval : PlannerUtil.getAllEqualEvals(qual)) { BinaryEval binaryEval = (BinaryEval) eval; // TODO: consider more complex predicates if (binaryEval.getLeftExpr().getType() == EvalType.FIELD && diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/IndexUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/IndexUtil.java deleted file mode 100644 index 8f847e0c3e..0000000000 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/IndexUtil.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.plan.util; - -import org.apache.tajo.catalog.SortSpec; -import org.apache.tajo.plan.expr.*; - -import java.util.LinkedList; -import java.util.List; -import java.util.Stack; - -public class IndexUtil { - - public static String getIndexName(String indexName , SortSpec[] keys) { - StringBuilder builder = new StringBuilder(); - builder.append(indexName + "_"); - for(int i = 0 ; i < keys.length ; i ++) { - builder.append(keys[i].getSortKey().getSimpleName() + "_"); - } - return builder.toString(); - } - - public static List getAllEqualEvals(EvalNode qual) { - EvalTreeUtil.EvalFinder finder = new EvalTreeUtil.EvalFinder(EvalType.EQUAL); - finder.visit(null, qual, new Stack()); - return finder.getEvalNodes(); - } - - private static class FieldAndValueFinder implements EvalNodeVisitor { - private LinkedList nodeList = new LinkedList(); - - public LinkedList getNodeList () { - return this.nodeList; - } - - @Override - public void visit(EvalNode node) { - BinaryEval binaryEval = (BinaryEval) node; - switch(node.getType()) { - case AND: - break; - case EQUAL: - if( binaryEval.getLeftExpr().getType() == EvalType.FIELD - && binaryEval.getRightExpr().getType() == EvalType.CONST ) { - nodeList.add(binaryEval); - } - break; - case IS_NULL: - if( binaryEval.getLeftExpr().getType() == EvalType.FIELD - && binaryEval.getRightExpr().getType() == EvalType.CONST) { - nodeList.add(binaryEval); - } - } - } - } -} diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index a9dca4ce1a..d9fb218e65 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -992,4 +992,10 @@ public static List extractInSubquery(Expr qual) { } return inSubqueries; } + + public static List getAllEqualEvals(EvalNode qual) { + EvalTreeUtil.EvalFinder finder = new EvalTreeUtil.EvalFinder(EvalType.EQUAL); + finder.visit(null, qual, new Stack()); + return finder.getEvalNodes(); + } } From e3e3d160272b2405796dd83497fccf0ea8fbe181 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Mon, 24 Aug 2015 22:25:40 +0900 Subject: [PATCH 18/18] add license --- .../planner/physical/IndexExecutorUtil.java | 18 ++++++++++++++++++ .../apache/tajo/engine/utils/CacheHolder.java | 10 +++++++++- .../apache/tajo/worker/TaskAttemptContext.java | 9 --------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java index 9c8bc457a5..3b8317fe75 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/IndexExecutorUtil.java @@ -1,3 +1,21 @@ +/** + * 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.tajo.catalog.proto.CatalogProtos.FragmentProto; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java index b1a521bda8..6eda7e8089 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/utils/CacheHolder.java @@ -18,6 +18,7 @@ package org.apache.tajo.engine.utils; +import org.apache.tajo.QueryId; import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.engine.planner.physical.ScanExec; @@ -81,7 +82,14 @@ public void release() { public static TableCacheKey getCacheKey(TaskAttemptContext ctx, ScanExec scanExec) throws IOException { return new TableCacheKey(ctx.getTaskId().getTaskId().getExecutionBlockId().toString(), - scanExec.getCanonicalName(), TaskAttemptContext.getUniqueKeyFromFragments(ctx, scanExec)); + scanExec.getCanonicalName(), getUniqueKey(ctx, scanExec)); + } + + public static String getUniqueKey(TaskAttemptContext context, ScanExec scanExec) { + QueryId queryId = context.getTaskId().getTaskId().getExecutionBlockId().getQueryId(); + int pid = scanExec.getScanNode().getPID(); + + return queryId.toString() + "_" + pid; } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java index d251a9262d..a2f8c06f4c 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java @@ -24,7 +24,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.Path; -import org.apache.tajo.QueryId; import org.apache.tajo.TajoProtos.TaskAttemptState; import org.apache.tajo.TaskAttemptId; import org.apache.tajo.catalog.Schema; @@ -33,7 +32,6 @@ import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.planner.enforce.Enforcer; import org.apache.tajo.engine.planner.global.DataChannel; -import org.apache.tajo.engine.planner.physical.ScanExec; import org.apache.tajo.engine.query.QueryContext; import org.apache.tajo.plan.expr.EvalContext; import org.apache.tajo.plan.expr.EvalNode; @@ -375,13 +373,6 @@ public Collection getInputTables() { return fragmentMap.get(id).toArray(new FragmentProto[fragmentMap.get(id).size()]); } - public static String getUniqueKeyFromFragments(TaskAttemptContext context, ScanExec scanExec) { - QueryId queryId = context.taskId.getTaskId().getExecutionBlockId().getQueryId(); - int pid = scanExec.getScanNode().getPID(); - - return queryId.toString() + pid; - } - public int hashCode() { return Objects.hashCode(taskId); }