[HOTFIX] Fix ArrayOutOfBound exception when duplicate measure in projection column
problem: ArrayOutOfBound exception when duplicate measure in the projection column cause: In query executor, when the reusable buffer is formed. It was considering only the unique values. Need to consider all the projections. solution: consider all the projections, while forming a reusable buffer. This closes #2964 Project: http://git-wip-us.apache.org/repos/asf/carbondata/repo Commit: http://git-wip-us.apache.org/repos/asf/carbondata/commit/3ebb6e56 Tree: http://git-wip-us.apache.org/repos/asf/carbondata/tree/3ebb6e56 Diff: http://git-wip-us.apache.org/repos/asf/carbondata/diff/3ebb6e56 Branch: refs/heads/branch-1.5 Commit: 3ebb6e56763985c830299ea00918949a50bcedb5 Parents: d28f87c Author: ajantha-bhat <ajanthab...@gmail.com> Authored: Thu Nov 29 17:12:56 2018 +0530 Committer: ravipesala <ravi.pes...@gmail.com> Committed: Fri Nov 30 21:57:21 2018 +0530 ---------------------------------------------------------------------- .../scan/executor/impl/AbstractQueryExecutor.java | 14 ++++++-------- .../apache/carbondata/sdk/file/CarbonReaderTest.java | 4 ++-- 2 files changed, 8 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/carbondata/blob/3ebb6e56/core/src/main/java/org/apache/carbondata/core/scan/executor/impl/AbstractQueryExecutor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/scan/executor/impl/AbstractQueryExecutor.java b/core/src/main/java/org/apache/carbondata/core/scan/executor/impl/AbstractQueryExecutor.java index 7c5287d..34de4b7 100644 --- a/core/src/main/java/org/apache/carbondata/core/scan/executor/impl/AbstractQueryExecutor.java +++ b/core/src/main/java/org/apache/carbondata/core/scan/executor/impl/AbstractQueryExecutor.java @@ -549,12 +549,9 @@ public abstract class AbstractQueryExecutor<E> implements QueryExecutor<E> { int[] dimensionChunkIndexes = QueryUtil.getDimensionChunkIndexes(projectDimensions, segmentProperties.getDimensionOrdinalToChunkMapping(), currentBlockFilterDimensions, allProjectionListDimensionIdexes); - int reusableBufferSize = segmentProperties.getDimensionOrdinalToChunkMapping().size() - < projectDimensions.size() ? - projectDimensions.size() : - segmentProperties.getDimensionOrdinalToChunkMapping().size(); - ReusableDataBuffer[] dimensionBuffer = - new ReusableDataBuffer[reusableBufferSize]; + int reusableBufferSize = Math.max(segmentProperties.getDimensionOrdinalToChunkMapping().size(), + projectDimensions.size()); + ReusableDataBuffer[] dimensionBuffer = new ReusableDataBuffer[reusableBufferSize]; for (int i = 0; i < dimensionBuffer.length; i++) { dimensionBuffer[i] = new ReusableDataBuffer(); } @@ -583,8 +580,9 @@ public abstract class AbstractQueryExecutor<E> implements QueryExecutor<E> { currentBlockQueryMeasures, expressionMeasures, segmentProperties.getMeasuresOrdinalToChunkMapping(), filterMeasures, allProjectionListMeasureIndexes); - ReusableDataBuffer[] measureBuffer = - new ReusableDataBuffer[segmentProperties.getMeasuresOrdinalToChunkMapping().size()]; + reusableBufferSize = Math.max(segmentProperties.getMeasuresOrdinalToChunkMapping().size(), + allProjectionListMeasureIndexes.size()); + ReusableDataBuffer[] measureBuffer = new ReusableDataBuffer[reusableBufferSize]; for (int i = 0; i < measureBuffer.length; i++) { measureBuffer[i] = new ReusableDataBuffer(); } http://git-wip-us.apache.org/repos/asf/carbondata/blob/3ebb6e56/store/sdk/src/test/java/org/apache/carbondata/sdk/file/CarbonReaderTest.java ---------------------------------------------------------------------- diff --git a/store/sdk/src/test/java/org/apache/carbondata/sdk/file/CarbonReaderTest.java b/store/sdk/src/test/java/org/apache/carbondata/sdk/file/CarbonReaderTest.java index 9add0b9..4e11233 100644 --- a/store/sdk/src/test/java/org/apache/carbondata/sdk/file/CarbonReaderTest.java +++ b/store/sdk/src/test/java/org/apache/carbondata/sdk/file/CarbonReaderTest.java @@ -575,7 +575,7 @@ public class CarbonReaderTest extends TestCase { CarbonReader reader = CarbonReader .builder(path, "_temp") - .projection(new String[]{"name", "name", "age", "name"}) + .projection(new String[]{"name", "age", "age", "name"}) .build(); // expected output after sorting @@ -591,7 +591,7 @@ public class CarbonReaderTest extends TestCase { Object[] row = (Object[]) reader.readNextRow(); // Default sort column is applied for dimensions. So, need to validate accordingly Assert.assertEquals(name[i], row[0]); - Assert.assertEquals(name[i], row[1]); + Assert.assertEquals(age[i], row[1]); Assert.assertEquals(age[i], row[2]); Assert.assertEquals(name[i], row[3]); i++;