tajo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hyun...@apache.org
Subject git commit: TAJO-929: Broadcast join with empty outer join table returns empty result. (Hyoungjun Kim via hyunsik)
Date Fri, 11 Jul 2014 06:14:25 GMT
Repository: tajo
Updated Branches:
  refs/heads/master 42f3b4dd8 -> 329e508ca


TAJO-929: Broadcast join with empty outer join table returns empty result. (Hyoungjun Kim
via hyunsik)

Closes #66


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

Branch: refs/heads/master
Commit: 329e508caf88b3f75e465581599a255eceabb16a
Parents: 42f3b4d
Author: Hyunsik Choi <hyunsik@apache.org>
Authored: Fri Jul 11 15:13:05 2014 +0900
Committer: Hyunsik Choi <hyunsik@apache.org>
Committed: Fri Jul 11 15:13:11 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |  5 +++-
 .../tajo/master/querymaster/Repartitioner.java  | 11 ++++++---
 .../tajo/engine/query/TestJoinBroadcast.java    | 26 ++++++++++++++++++++
 3 files changed, 38 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/329e508c/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 0694eba..921183e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -82,7 +82,10 @@ Release 0.9.0 - unreleased
 
   BUG FIXES
  
-    TAJO-927: Broadcast Join with Large, Small, Large, Small tables 
+    TAJO-929: Broadcast join with empty outer join table returns empty result.
+    (Hyoungjun Kim via hyunsik)
+
+    TAJO-927: Broadcast Join with Large, Small, Large, Small tables
     makes a wrong plan. (Hyoungjun Kim via hyunsik)
 
     TAJO-913: Add some missed tests for constant value group-by keys. 

http://git-wip-us.apache.org/repos/asf/tajo/blob/329e508c/tajo-core/src/main/java/org/apache/tajo/master/querymaster/Repartitioner.java
----------------------------------------------------------------------
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 fc80bd1..ce2194e 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
@@ -119,13 +119,18 @@ public class Repartitioner {
       }
     }
 
-    // If one of inner join tables has no input data, it should return zero rows.
+    // If one of inner join tables has no input data, it means that this execution block
has no result row.
     JoinNode joinNode = PlannerUtil.findMostBottomNode(execBlock.getPlan(), NodeType.JOIN);
     if (joinNode != null) {
       if ( (joinNode.getJoinType() == JoinType.INNER)) {
+        LogicalNode leftNode = joinNode.getLeftChild();
+        LogicalNode rightNode = joinNode.getRightChild();
         for (int i = 0; i < stats.length; i++) {
-          if (stats[i] == 0) {
-            return;
+          if (scans[i].getPID() == leftNode.getPID() || scans[i].getPID() == rightNode.getPID())
{
+            if (stats[i] == 0) {
+              LOG.info(scans[i] + " 's input data is zero. Inner join's result is empty.");
+              return;
+            }
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/tajo/blob/329e508c/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinBroadcast.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinBroadcast.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinBroadcast.java
index 668992b..e01b3c5 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinBroadcast.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinBroadcast.java
@@ -504,6 +504,32 @@ public class TestJoinBroadcast extends QueryTestCaseBase {
     }
   }
 
+  @Test
+  public final void testInnerAndOuterWithEmpty() throws Exception {
+    executeDDL("customer_partition_ddl.sql", null);
+    executeFile("insert_into_customer_partition.sql").close();
+
+    // outer join table is empty
+    ResultSet res = executeString(
+        "select a.l_orderkey, b.o_orderkey, c.c_custkey from lineitem a " +
+            "inner join orders b on a.l_orderkey = b.o_orderkey " +
+            "left outer join customer_broad_parts c on a.l_orderkey = c.c_custkey and c.c_custkey
< 0"
+    );
+
+    String expected = "l_orderkey,o_orderkey,c_custkey\n" +
+        "-------------------------------\n" +
+        "1,1,null\n" +
+        "1,1,null\n" +
+        "2,2,null\n" +
+        "3,3,null\n" +
+        "3,3,null\n";
+
+    assertEquals(expected, resultSetToString(res));
+    res.close();
+
+    executeString("DROP TABLE customer_broad_parts PURGE").close();
+  }
+
   static interface TupleCreator {
     public Tuple createTuple(String[] columnDatas);
   }


Mime
View raw message