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

cwylie 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 d30efb1c1e fix bug when rewriting sql virtual column registry (#12718)
d30efb1c1e is described below

commit d30efb1c1e2b36099727c48f7252cc0bd88a67e7
Author: Clint Wylie <[email protected]>
AuthorDate: Fri Jul 1 02:24:00 2022 -0700

    fix bug when rewriting sql virtual column registry (#12718)
---
 .../sql/calcite/rel/VirtualColumnRegistry.java     |  8 ++-
 .../calcite/CalciteMultiValueStringQueryTest.java  | 61 ++++++++++++++++++++++
 2 files changed, 67 insertions(+), 2 deletions(-)

diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/VirtualColumnRegistry.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/VirtualColumnRegistry.java
index d07586ec2f..ec6f8c7ee3 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/VirtualColumnRegistry.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/VirtualColumnRegistry.java
@@ -29,12 +29,14 @@ import org.apache.druid.sql.calcite.planner.Calcites;
 import org.apache.druid.sql.calcite.planner.PlannerContext;
 
 import javax.annotation.Nullable;
+import java.util.ArrayDeque;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Queue;
 import java.util.stream.Collectors;
 
 /**
@@ -198,13 +200,15 @@ public class VirtualColumnRegistry
 
   public void visitAllSubExpressions(DruidExpression.DruidExpressionShuttle 
shuttle)
   {
-    for (Map.Entry<String, ExpressionAndTypeHint> entry : 
virtualColumnsByName.entrySet()) {
+    final Queue<Map.Entry<String, ExpressionAndTypeHint>> toVisit = new 
ArrayDeque<>(virtualColumnsByName.entrySet());
+    while (!toVisit.isEmpty()) {
+      final Map.Entry<String, ExpressionAndTypeHint> entry = toVisit.poll();
       final String key = entry.getKey();
       final ExpressionAndTypeHint wrapped = entry.getValue();
-      virtualColumnsByExpression.remove(wrapped);
       final List<DruidExpression> newArgs = 
shuttle.visitAll(wrapped.getExpression().getArguments());
       final ExpressionAndTypeHint newWrapped = 
wrap(wrapped.getExpression().withArguments(newArgs), wrapped.getTypeHint());
       virtualColumnsByName.put(key, newWrapped);
+      virtualColumnsByExpression.remove(wrapped);
       virtualColumnsByExpression.put(newWrapped, key);
     }
   }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
index 28fd4d463f..a62402cba4 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteMultiValueStringQueryTest.java
@@ -1428,6 +1428,67 @@ public class CalciteMultiValueStringQueryTest extends 
BaseCalciteQueryTest
     );
   }
 
+  @Test
+  public void testMultiValueListFilterComposedMultipleExpressions() throws 
Exception
+  {
+    // Cannot vectorize due to usage of expressions.
+    cannotVectorize();
+
+    testQuery(
+        "SELECT MV_LENGTH(MV_FILTER_ONLY(dim3, ARRAY['b'])), MV_LENGTH(dim3), 
SUM(cnt) FROM druid.numfoo GROUP BY 1,2 ORDER BY 3 DESC",
+        ImmutableList.of(
+            GroupByQuery.builder()
+                        .setDataSource(CalciteTests.DATASOURCE3)
+                        .setInterval(querySegmentSpec(Filtration.eternity()))
+                        .setGranularity(Granularities.ALL)
+                        .setVirtualColumns(
+                            expressionVirtualColumn(
+                                "v0",
+                                "array_length(\"v2\")",
+                                ColumnType.LONG
+                            ),
+                            expressionVirtualColumn(
+                                "v1",
+                                "array_length(\"dim3\")",
+                                ColumnType.LONG
+                            ),
+                            new ListFilteredVirtualColumn(
+                                "v2",
+                                DefaultDimensionSpec.of("dim3"),
+                                ImmutableSet.of("b"),
+                                true
+                            )
+                        )
+                        .setDimensions(
+                            dimensions(
+                                new DefaultDimensionSpec("v0", "_d0", 
ColumnType.LONG),
+                                new DefaultDimensionSpec("v1", "_d1", 
ColumnType.LONG)
+                            )
+                        )
+                        .setAggregatorSpecs(aggregators(new 
LongSumAggregatorFactory("a0", "cnt")))
+                        .setLimitSpec(new DefaultLimitSpec(
+                            ImmutableList.of(new OrderByColumnSpec(
+                                "a0",
+                                OrderByColumnSpec.Direction.DESCENDING,
+                                StringComparators.NUMERIC
+                            )),
+                            Integer.MAX_VALUE
+                        ))
+                        .setContext(QUERY_CONTEXT_DEFAULT)
+                        .build()
+        ),
+        useDefault ? ImmutableList.of(
+            new Object[]{0, 0, 3L},
+            new Object[]{1, 2, 2L},
+            new Object[]{0, 1, 1L}
+        ) : ImmutableList.of(
+            new Object[]{null, null, 2L},
+            new Object[]{null, 1, 2L},
+            new Object[]{1, 2, 2L}
+        )
+    );
+  }
+
   @Test
   public void testFilterOnMultiValueListFilterNoMatch() throws Exception
   {


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

Reply via email to