TAJO-1102: Self-join with a partitioned table returns wrong result data.

Closes #189


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

Branch: refs/heads/block_iteration
Commit: f42baa005dbf3f4fe64e3f3745616164df9aba65
Parents: 0b2ea88
Author: HyoungJun Kim <[email protected]>
Authored: Wed Oct 8 20:04:55 2014 +0900
Committer: HyoungJun Kim <[email protected]>
Committed: Wed Oct 8 20:04:55 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |  3 +
 .../logical/PartitionedTableScanNode.java       |  4 ++
 .../tajo/engine/planner/logical/ScanNode.java   | 30 +++++-----
 .../tajo/engine/query/TestJoinBroadcast.java    | 61 ++++++++++++++++++++
 ...castMultiColumnPartitionTableInFilter.result |  0
 5 files changed, 85 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/f42baa00/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 6122682..8a39f3c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -163,6 +163,9 @@ Release 0.9.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1102: Self-join with a partitioned table returns wrong result data.
+    (Hyoungjun Kim)
+
     TAJO-1097: IllegalArgumentException: RawFileScanner. (Mai Hai Thanh via 
jinho)
 
     TAJO-1103: Insert clause of partitioned table loses some FetchImpls. 
(jinho)

http://git-wip-us.apache.org/repos/asf/tajo/blob/f42baa00/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/PartitionedTableScanNode.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/PartitionedTableScanNode.java
 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/PartitionedTableScanNode.java
index 45cc578..c33bdf5 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/PartitionedTableScanNode.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/PartitionedTableScanNode.java
@@ -41,6 +41,10 @@ public class PartitionedTableScanNode extends ScanNode {
     this.qual = scanNode.qual;
     this.targets = scanNode.targets;
     this.inputPaths = inputPaths;
+
+    if (scanNode.hasAlias()) {
+      alias = scanNode.alias;
+    }
   }
 
   public void setInputPaths(Path [] paths) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/f42baa00/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
index 8d28e6e..fc5cefc 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
@@ -180,22 +180,26 @@ public class ScanNode extends RelationNode implements 
Projectable, SelectableNod
        
        @Override
        public Object clone() throws CloneNotSupportedException {
-         ScanNode scanNode = (ScanNode) super.clone();
-         
-         scanNode.tableDesc = (TableDesc) this.tableDesc.clone();
-         
-         if (hasQual()) {
-           scanNode.qual = (EvalNode) this.qual.clone();
-         }
-         
-         if (hasTargets()) {
-           scanNode.targets = new Target[targets.length];
+    ScanNode scanNode = (ScanNode) super.clone();
+
+    scanNode.tableDesc = (TableDesc) this.tableDesc.clone();
+
+    if (hasQual()) {
+      scanNode.qual = (EvalNode) this.qual.clone();
+    }
+
+    if (hasTargets()) {
+      scanNode.targets = new Target[targets.length];
       for (int i = 0; i < targets.length; i++) {
         scanNode.targets[i] = (Target) targets[i].clone();
       }
-         }
-         
-         return scanNode;
+    }
+
+    if (hasAlias()) {
+      scanNode.alias = alias;
+    }
+
+    return scanNode;
        }
        
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/f42baa00/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 768d5aa..f5e1fad 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
@@ -649,6 +649,67 @@ public class TestJoinBroadcast extends QueryTestCaseBase {
   }
 
   @Test
+  public final void testSelfJoin2() throws Exception {
+    /*
+     https://issues.apache.org/jira/browse/TAJO-1102
+     See the following case.
+     CREATE TABLE orders_partition
+       (o_orderkey INT8, o_custkey INT8, o_totalprice FLOAT8, o_orderpriority 
TEXT,
+          o_clerk TEXT, o_shippriority INT4, o_comment TEXT) USING CSV WITH 
('csvfile.delimiter'='|')
+       PARTITION BY COLUMN(o_orderdate TEXT, o_orderstatus TEXT);
+
+     select a.o_orderstatus, count(*) as cnt
+      from orders_partition a
+      inner join orders_partition b
+        on a.o_orderdate = b.o_orderdate
+            and a.o_orderstatus = b.o_orderstatus
+            and a.o_orderkey = b.o_orderkey
+      where a.o_orderdate='1995-02-21'
+        and a.o_orderstatus in ('F')
+      group by a.o_orderstatus;
+
+      Because of the where condition[where a.o_orderdate='1995-02-21 and 
a.o_orderstatus in ('F')],
+        orders_partition table aliased a is small and broadcast target.
+    */
+    String tableName = 
CatalogUtil.normalizeIdentifier("partitioned_orders_large");
+    ResultSet res = executeString(
+        "create table " + tableName + " (o_orderkey INT8, o_custkey INT8, 
o_totalprice FLOAT8, o_orderpriority TEXT,\n" +
+            "o_clerk TEXT, o_shippriority INT4, o_comment TEXT) USING CSV WITH 
('csvfile.delimiter'='|')\n" +
+            "PARTITION BY COLUMN(o_orderdate TEXT, o_orderstatus TEXT, 
o_orderkey_mod INT8)");
+    res.close();
+    assertTrue(catalog.existsTable(DEFAULT_DATABASE_NAME, tableName));
+
+    res = executeString(
+        "insert overwrite into " + tableName +
+            " select o_orderkey, o_custkey, o_totalprice, " +
+            " o_orderpriority, o_clerk, o_shippriority, o_comment, 
o_orderdate, o_orderstatus, o_orderkey % 10 " +
+            " from orders_large ");
+    res.close();
+
+    res = executeString(
+        "select a.o_orderdate, a.o_orderstatus, a.o_orderkey % 10 as 
o_orderkey_mod, a.o_totalprice " +
+            "from orders_large a " +
+            "join orders_large b on a.o_orderkey = b.o_orderkey " +
+            "where a.o_orderdate = '1993-10-14' and a.o_orderstatus = 'F' and 
a.o_orderkey % 10 = 1" +
+            " order by a.o_orderkey"
+    );
+    String expected = resultSetToString(res);
+    res.close();
+
+    res = executeString(
+        "select a.o_orderdate, a.o_orderstatus, a.o_orderkey_mod, 
a.o_totalprice " +
+            "from " + tableName +
+            " a join "+ tableName + " b on a.o_orderkey = b.o_orderkey " +
+            "where a.o_orderdate = '1993-10-14' and a.o_orderstatus = 'F' and 
o_orderkey_mod = 1 " +
+            " order by a.o_orderkey"
+    );
+    String resultSetData = resultSetToString(res);
+    res.close();
+
+    assertEquals(expected, resultSetData);
+
+  }
+  @Test
   public void testMultipleBroadcastDataFileWithZeroLength() throws Exception {
     createMultiFile("nation", 2, new TupleCreator() {
       public Tuple createTuple(String[] columnDatas) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/f42baa00/tajo-core/src/test/resources/results/TestJoinBroadcast/testBroadcastMultiColumnPartitionTableInFilter.result
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/test/resources/results/TestJoinBroadcast/testBroadcastMultiColumnPartitionTableInFilter.result
 
b/tajo-core/src/test/resources/results/TestJoinBroadcast/testBroadcastMultiColumnPartitionTableInFilter.result
new file mode 100644
index 0000000..e69de29

Reply via email to