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

abhishek 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 279b3818f0e Make Unnest work with nullif operator (#14993)
279b3818f0e is described below

commit 279b3818f0e02f6a2ff389532f1e6118598a7c24
Author: Soumyava <[email protected]>
AuthorDate: Thu Sep 14 21:24:14 2023 -0700

    Make Unnest work with nullif operator (#14993)
    
    This is due to the recursive filter creation in unnest storage adapter not 
performing correctly in case of an empty children. This PR addresses the issue
---
 .../apache/druid/segment/UnnestStorageAdapter.java |  7 +++-
 .../druid/sql/calcite/CalciteArraysQueryTest.java  | 48 ++++++++++++++++++++++
 2 files changed, 53 insertions(+), 2 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/UnnestStorageAdapter.java 
b/processing/src/main/java/org/apache/druid/segment/UnnestStorageAdapter.java
index 83694d9618d..02f8c0064aa 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/UnnestStorageAdapter.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/UnnestStorageAdapter.java
@@ -478,13 +478,16 @@ public class UnnestStorageAdapter implements 
StorageAdapter
     for (Filter filter : queryFilter.getFilters()) {
       if (filter.getRequiredColumns().contains(outputColumnName)) {
         if (filter instanceof AndFilter) {
-          preFilterList.add(new AndFilter(recursiveRewriteOnUnnestFilters(
+          List<Filter> andChildFilters = recursiveRewriteOnUnnestFilters(
               (BooleanFilter) filter,
               inputColumn,
               inputColumnCapabilites,
               filterSplitter,
               isTopLevelAndFilter
-          )));
+          );
+          if (!andChildFilters.isEmpty()) {
+            preFilterList.add(new AndFilter(andChildFilters));
+          }
         } else if (filter instanceof OrFilter) {
           // in case of Or Fiters, we set isTopLevelAndFilter to false that 
prevents pushing down any child filters to base
           List<Filter> orChildFilters = recursiveRewriteOnUnnestFilters(
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteArraysQueryTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteArraysQueryTest.java
index 4842044892d..df4e9b62cc9 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteArraysQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteArraysQueryTest.java
@@ -4807,4 +4807,52 @@ public class CalciteArraysQueryTest extends 
BaseCalciteQueryTest
         )
     );
   }
+
+  @Test
+  public void testUnnestVirtualWithColumnsAndNullIf()
+  {
+    skipVectorize();
+    cannotVectorize();
+    testQuery(
+        "select c,m2 from druid.foo, unnest(ARRAY[\"m1\", \"m2\"]) as u(c) 
where NULLIF(c,m2) IS NULL",
+        QUERY_CONTEXT_UNNEST,
+        ImmutableList.of(
+            Druids.newScanQueryBuilder()
+                  .dataSource(UnnestDataSource.create(
+                      new TableDataSource(CalciteTests.DATASOURCE1),
+                      expressionVirtualColumn("j0.unnest", 
"array(\"m1\",\"m2\")", ColumnType.FLOAT_ARRAY),
+                      null
+                  ))
+                  .intervals(querySegmentSpec(Filtration.eternity()))
+                  
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+                  .filters(
+                      useDefault ? expressionFilter("(\"j0.unnest\" == 
\"m2\")") :
+                      or(
+                          expressionFilter("(\"j0.unnest\" == \"m2\")"),
+                          and(
+                              isNull("j0.unnest"),
+                              not(expressionFilter("(\"j0.unnest\" == 
\"m2\")"))
+                          )
+                      ))
+                  .legacy(false)
+                  .context(QUERY_CONTEXT_UNNEST)
+                  .columns(ImmutableList.of("j0.unnest", "m2"))
+                  .build()
+        ),
+        ImmutableList.of(
+            new Object[]{1.0f, 1.0D},
+            new Object[]{1.0f, 1.0D},
+            new Object[]{2.0f, 2.0D},
+            new Object[]{2.0f, 2.0D},
+            new Object[]{3.0f, 3.0D},
+            new Object[]{3.0f, 3.0D},
+            new Object[]{4.0f, 4.0D},
+            new Object[]{4.0f, 4.0D},
+            new Object[]{5.0f, 5.0D},
+            new Object[]{5.0f, 5.0D},
+            new Object[]{6.0f, 6.0D},
+            new Object[]{6.0f, 6.0D}
+        )
+    );
+  }
 }


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

Reply via email to