From db4a235f588976b85e2a450010d8ac3814312de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=98=95=EC=A4=80?= Date: Mon, 30 Jun 2014 19:24:27 +0900 Subject: [PATCH] TAJO-896: Full outer join query with empty intermediate data doesn't terminate. --- .../master/querymaster/Repartitioner.java | 13 ++++++++++++ .../tajo/engine/query/TestJoinQuery.java | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/Repartitioner.java b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/Repartitioner.java index 93e40fd2c8..5024211b7b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/querymaster/Repartitioner.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/querymaster/Repartitioner.java @@ -126,6 +126,19 @@ public static void scheduleFragmentsForJoinQuery(TaskSchedulerContext schedulerC // If node is outer join and a preserved relation is empty, it should return zero rows. joinNode = PlannerUtil.findTopNode(execBlock.getPlan(), NodeType.JOIN); if (joinNode != null) { + // If all stats art zero, return + boolean isAllStatsZero = true; + for (int i = 0; i < stats.length; i++) { + if (stats[i] > 0) { + isAllStatsZero = false; + break; + } + } + if (isAllStatsZero) { + LOG.info("All join target data are empty."); + return; + } + // find left top scan node ScanNode leftScanNode = PlannerUtil.findTopNode(joinNode.getLeftChild(), NodeType.SCAN); ScanNode rightScanNode = PlannerUtil.findTopNode(joinNode.getRightChild(), NodeType.SCAN); diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java index e109616725..8f8f86bbe8 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java @@ -1010,4 +1010,24 @@ public void testComplexJoinCondition4() throws Exception { assertResultSet(res); cleanupQuery(res); } + + @Test + public void testFullOuterJoinWithEmptyIntermediateData() throws Exception { + ResultSet res = executeString( + "select a.l_orderkey \n" + + "from (select * from lineitem where l_orderkey < 0) a\n" + + "full outer join (select * from lineitem where l_orderkey < 0) b\n" + + "on a.l_orderkey = b.l_orderkey" + ); + + try { + String expected = + "l_orderkey\n" + + "-------------------------------\n"; + + assertEquals(expected, resultSetToString(res)); + } finally { + cleanupQuery(res); + } + } }