This is an automated email from the ASF dual-hosted git repository.

karan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d6cedb25fd Fix IndexOutOfBoundsException for MSQ window function 
queries with empty RAC (#16865)
3d6cedb25fd is described below

commit 3d6cedb25fd81f2415b4f46b025f3624e8501550
Author: Akshat Jain <[email protected]>
AuthorDate: Fri Aug 9 11:39:53 2024 +0530

    Fix IndexOutOfBoundsException for MSQ window function queries with empty 
RAC (#16865)
    
    * Fix IndexOutOfBoundsException for MSQ window function queries with empty 
RAC
---
 .../query/rowsandcols/ConcatRowsAndColumns.java    |  9 ++++
 .../rowsandcols/ConcatRowsAndColumnsTest.java      | 57 ++++++++++++++++++++++
 .../druid/sql/calcite/DrillWindowQueryTest.java    |  7 +++
 .../empty_over_clause/single_empty_over_3.e        |  0
 .../empty_over_clause/single_empty_over_3.q        |  4 ++
 5 files changed, 77 insertions(+)

diff --git 
a/processing/src/main/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumns.java
 
b/processing/src/main/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumns.java
index 523a982fbaf..c6ced60849d 100644
--- 
a/processing/src/main/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumns.java
+++ 
b/processing/src/main/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumns.java
@@ -19,6 +19,7 @@
 
 package org.apache.druid.query.rowsandcols;
 
+import com.google.common.base.Preconditions;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.query.rowsandcols.column.Column;
 import org.apache.druid.query.rowsandcols.column.ColumnAccessor;
@@ -30,6 +31,7 @@ import javax.annotation.Nullable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -53,6 +55,7 @@ public class ConcatRowsAndColumns implements RowsAndColumns
       ArrayList<RowsAndColumns> racBuffer
   )
   {
+    Preconditions.checkNotNull(racBuffer, "racBuffer cannot be null");
     this.racBuffer = racBuffer;
 
     int numRows = 0;
@@ -76,6 +79,9 @@ public class ConcatRowsAndColumns implements RowsAndColumns
   @Override
   public Collection<String> getColumnNames()
   {
+    if (racBuffer.isEmpty()) {
+      return Collections.emptySet();
+    }
     return racBuffer.get(0).getColumnNames();
   }
 
@@ -92,6 +98,9 @@ public class ConcatRowsAndColumns implements RowsAndColumns
     if (columnCache.containsKey(name)) {
       return columnCache.get(name);
     } else {
+      if (racBuffer.isEmpty()) {
+        return null;
+      }
       final Column firstCol = racBuffer.get(0).findColumn(name);
       if (firstCol == null) {
         for (int i = 1; i < racBuffer.size(); ++i) {
diff --git 
a/processing/src/test/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumnsTest.java
 
b/processing/src/test/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumnsTest.java
index b95f750632d..0bf0450114b 100644
--- 
a/processing/src/test/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumnsTest.java
+++ 
b/processing/src/test/java/org/apache/druid/query/rowsandcols/ConcatRowsAndColumnsTest.java
@@ -19,7 +19,13 @@
 
 package org.apache.druid.query.rowsandcols;
 
+import com.google.common.collect.ImmutableMap;
+import org.apache.druid.query.rowsandcols.column.IntArrayColumn;
+import org.junit.Assert;
+import org.junit.Test;
+
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.function.Function;
 
 public class ConcatRowsAndColumnsTest extends RowsAndColumnsTestBase
@@ -42,4 +48,55 @@ public class ConcatRowsAndColumnsTest extends 
RowsAndColumnsTestBase
 
     return new ConcatRowsAndColumns(theRac);
   };
+
+  @Test
+  public void testConstructorWithNullRacBuffer()
+  {
+    final NullPointerException e = Assert.assertThrows(
+        NullPointerException.class,
+        () -> new ConcatRowsAndColumns(null)
+    );
+    Assert.assertEquals("racBuffer cannot be null", e.getMessage());
+  }
+
+  @Test
+  public void testFindColumn()
+  {
+    MapOfColumnsRowsAndColumns rac = MapOfColumnsRowsAndColumns.fromMap(
+        ImmutableMap.of(
+            "column1", new IntArrayColumn(new int[]{1, 2, 3, 4, 5, 6}),
+            "column2", new IntArrayColumn(new int[]{6, 5, 4, 3, 2, 1})
+        )
+    );
+    ConcatRowsAndColumns apply = MAKER.apply(rac);
+    Assert.assertEquals(1, apply.findColumn("column1").toAccessor().getInt(0));
+    Assert.assertEquals(6, apply.findColumn("column2").toAccessor().getInt(0));
+  }
+
+  @Test
+  public void testFindColumnWithEmptyRacBuffer()
+  {
+    ConcatRowsAndColumns concatRowsAndColumns = new ConcatRowsAndColumns(new 
ArrayList<>());
+    Assert.assertNull(concatRowsAndColumns.findColumn("columnName"));
+  }
+
+  @Test
+  public void testGetColumns()
+  {
+    MapOfColumnsRowsAndColumns rac = MapOfColumnsRowsAndColumns.fromMap(
+        ImmutableMap.of(
+            "column1", new IntArrayColumn(new int[]{0, 0, 0, 1, 1, 2, 4, 4, 
4}),
+            "column2", new IntArrayColumn(new int[]{3, 54, 21, 1, 5, 54, 2, 3, 
92})
+        )
+    );
+    ConcatRowsAndColumns apply = MAKER.apply(rac);
+    Assert.assertEquals(Arrays.asList("column1", "column2"), new 
ArrayList<>(apply.getColumnNames()));
+  }
+
+  @Test
+  public void testGetColumnsWithEmptyRacBuffer()
+  {
+    ConcatRowsAndColumns concatRowsAndColumns = new ConcatRowsAndColumns(new 
ArrayList<>());
+    Assert.assertTrue(concatRowsAndColumns.getColumnNames().isEmpty());
+  }
 }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java
index 4a2f0945087..9bf56d97d38 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java
@@ -7622,6 +7622,13 @@ public class DrillWindowQueryTest extends 
BaseCalciteQueryTest
     windowQueryTest();
   }
 
+  @DrillTest("druid_queries/empty_over_clause/single_empty_over_3")
+  @Test
+  public void test_empty_over_single_empty_over_3()
+  {
+    windowQueryTest();
+  }
+
   @DrillTest("druid_queries/empty_over_clause/multiple_empty_over_1")
   @Test
   public void test_empty_over_multiple_empty_over_1()
diff --git 
a/sql/src/test/resources/drill/window/queries/druid_queries/empty_over_clause/single_empty_over_3.e
 
b/sql/src/test/resources/drill/window/queries/druid_queries/empty_over_clause/single_empty_over_3.e
new file mode 100644
index 00000000000..e69de29bb2d
diff --git 
a/sql/src/test/resources/drill/window/queries/druid_queries/empty_over_clause/single_empty_over_3.q
 
b/sql/src/test/resources/drill/window/queries/druid_queries/empty_over_clause/single_empty_over_3.q
new file mode 100644
index 00000000000..ac8c5e930d3
--- /dev/null
+++ 
b/sql/src/test/resources/drill/window/queries/druid_queries/empty_over_clause/single_empty_over_3.q
@@ -0,0 +1,4 @@
+select countryName, row_number() over () as c1
+from wikipedia
+where countryName in ('non-existent-country')
+group by countryName, cityName, channel


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to