aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java7
-rw-r--r--exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java23
-rwxr-xr-xexec/java-exec/src/test/resources/join/j1/0_0_0.parquetbin0 -> 9849 bytes
-rwxr-xr-xexec/java-exec/src/test/resources/join/j1/0_0_1.parquetbin0 -> 1028 bytes
-rwxr-xr-xexec/java-exec/src/test/resources/join/j2/0_0_0.parquetbin0 -> 2399 bytes
5 files changed, 29 insertions, 1 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java
index ee2ce7fdc..2e777f66b 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java
@@ -378,8 +378,12 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> {
leftExpr[i] = materializeExpression(condition.getLeft(), lastLeftStatus, left, collector);
rightExpr[i] = materializeExpression(condition.getRight(), lastRightStatus, right, collector);
}
- JoinUtils.addLeastRestrictiveCasts(leftExpr, left, rightExpr, right, context);
+ // if right side is empty, rightExpr will most likely default to NULLABLE INT which may cause the following
+ // call to throw an exception. In this case we can safely skip adding the casts
+ if (lastRightStatus != IterOutcome.NONE) {
+ JoinUtils.addLeastRestrictiveCasts(leftExpr, left, rightExpr, right, context);
+ }
//generate doCompare() method
/////////////////////////////////////////
generateDoCompare(cg, incomingRecordBatch, leftExpr, incomingLeftRecordBatch, rightExpr,
@@ -561,4 +565,5 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> {
}
return materializedExpr;
}
+
}
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java
index c706638db..54539fd2e 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java
@@ -18,6 +18,9 @@
package org.apache.drill.exec.physical.impl.join;
import org.apache.drill.BaseTestQuery;
+import org.apache.drill.common.util.TestTools;
+import org.apache.drill.exec.ExecConstants;
+import org.apache.drill.exec.planner.physical.PlannerSettings;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -73,4 +76,24 @@ public class TestMergeJoinAdvanced extends BaseTestQuery {
.baselineValues(4l)
.go();
}
+
+ @Test
+ public void testFix2967() throws Exception {
+ setSessionOption(PlannerSettings.BROADCAST.getOptionName(), "false");
+ setSessionOption(PlannerSettings.HASHJOIN.getOptionName(), "false");
+ setSessionOption(ExecConstants.SLICE_TARGET, "1");
+ setSessionOption(ExecConstants.MAX_WIDTH_PER_NODE_KEY, "23");
+
+ final String TEST_RES_PATH = TestTools.getWorkingPath() + "/src/test/resources";
+
+ try {
+ test("select * from dfs_test.`%s/join/j1` j1 left outer join dfs_test.`%s/join/j2` j2 on (j1.c_varchar = j2.c_varchar)",
+ TEST_RES_PATH, TEST_RES_PATH);
+ } finally {
+ setSessionOption(PlannerSettings.BROADCAST.getOptionName(), String.valueOf(PlannerSettings.BROADCAST.getDefault().bool_val));
+ setSessionOption(PlannerSettings.HASHJOIN.getOptionName(), String.valueOf(PlannerSettings.HASHJOIN.getDefault().bool_val));
+ setSessionOption(ExecConstants.SLICE_TARGET, String.valueOf(ExecConstants.SLICE_TARGET_DEFAULT));
+ setSessionOption(ExecConstants.MAX_WIDTH_PER_NODE_KEY, String.valueOf(ExecConstants.MAX_WIDTH_PER_NODE.getDefault().num_val));
+ }
+ }
}
diff --git a/exec/java-exec/src/test/resources/join/j1/0_0_0.parquet b/exec/java-exec/src/test/resources/join/j1/0_0_0.parquet
new file mode 100755
index 000000000..395cab6a1
--- /dev/null
+++ b/exec/java-exec/src/test/resources/join/j1/0_0_0.parquet
Binary files differ
diff --git a/exec/java-exec/src/test/resources/join/j1/0_0_1.parquet b/exec/java-exec/src/test/resources/join/j1/0_0_1.parquet
new file mode 100755
index 000000000..62f7c075f
--- /dev/null
+++ b/exec/java-exec/src/test/resources/join/j1/0_0_1.parquet
Binary files differ
diff --git a/exec/java-exec/src/test/resources/join/j2/0_0_0.parquet b/exec/java-exec/src/test/resources/join/j2/0_0_0.parquet
new file mode 100755
index 000000000..419de5e46
--- /dev/null
+++ b/exec/java-exec/src/test/resources/join/j2/0_0_0.parquet
Binary files differ