[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++;

Reply via email to