DRILL-4884: Fix IOB exception in limit n query when n is beyond 65535. close apache/drill#584
Project: http://git-wip-us.apache.org/repos/asf/drill/repo Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/1e6fa00c Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/1e6fa00c Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/1e6fa00c Branch: refs/heads/master Commit: 1e6fa00cd4b0b1db41614749f6d12c03f0ca7990 Parents: 2081d76 Author: hongze.zhz <[email protected]> Authored: Fri Sep 9 16:19:16 2016 +0800 Committer: Jinfeng Ni <[email protected]> Committed: Sat Oct 29 22:12:36 2016 -0700 ---------------------------------------------------------------------- .../physical/impl/limit/LimitRecordBatch.java | 4 ++-- .../java/org/apache/drill/TestBugFixes.java | 21 +++++++++++++++++++ .../limit_test_parquet/test0_0_0.parquet | Bin 0 -> 428815 bytes 3 files changed, 23 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/drill/blob/1e6fa00c/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/limit/LimitRecordBatch.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/limit/LimitRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/limit/LimitRecordBatch.java index 176ee17..08ffc0b 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/limit/LimitRecordBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/limit/LimitRecordBatch.java @@ -163,8 +163,8 @@ public class LimitRecordBatch extends AbstractSingleRecordBatch<Limit> { } int svIndex = 0; - for(char i = (char) offset; i < fetch; svIndex++, i++) { - outgoingSv.setIndex(svIndex, i); + for(int i = offset; i < fetch; svIndex++, i++) { + outgoingSv.setIndex(svIndex, (char) i); } outgoingSv.setRecordCount(svIndex); } http://git-wip-us.apache.org/repos/asf/drill/blob/1e6fa00c/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java b/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java index 5b736bc..03b1b61 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java +++ b/exec/java-exec/src/test/java/org/apache/drill/TestBugFixes.java @@ -17,12 +17,17 @@ */ package org.apache.drill; +import com.google.common.collect.ImmutableList; import org.apache.drill.common.exceptions.UserException; import org.apache.drill.common.util.TestTools; import org.apache.drill.exec.planner.physical.PlannerSettings; import org.junit.Ignore; import org.junit.Test; +import java.util.Collections; +import java.util.List; +import java.util.Map; + public class TestBugFixes extends BaseTestQuery { private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestBugFixes.class); private static final String WORKING_PATH = TestTools.getWorkingPath(); @@ -200,4 +205,20 @@ public class TestBugFixes extends BaseTestQuery { .baselineValues("M", 554L, 11.9) .build().run(); } + + @Test + public void testDRILL4884() throws Exception { + int limit = 65536; + ImmutableList.Builder<Map<String, Object>> baselineBuilder = ImmutableList.builder(); + for (int i = 0; i < limit; i++) { + baselineBuilder.add(Collections.<String, Object>singletonMap("`id`", String.valueOf(i + 1))); + } + List<Map<String, Object>> baseline = baselineBuilder.build(); + + testBuilder() + .sqlQuery(String.format("select id from dfs_test.`%s/bugs/DRILL-4884/limit_test_parquet/test0_0_0.parquet` group by id limit %s", TEST_RES_PATH, limit)) + .unOrdered() + .baselineRecords(baseline) + .go(); + } } http://git-wip-us.apache.org/repos/asf/drill/blob/1e6fa00c/exec/java-exec/src/test/resources/bugs/DRILL-4884/limit_test_parquet/test0_0_0.parquet ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/resources/bugs/DRILL-4884/limit_test_parquet/test0_0_0.parquet b/exec/java-exec/src/test/resources/bugs/DRILL-4884/limit_test_parquet/test0_0_0.parquet new file mode 100644 index 0000000..15b1c25 Binary files /dev/null and b/exec/java-exec/src/test/resources/bugs/DRILL-4884/limit_test_parquet/test0_0_0.parquet differ
