You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by fj...@apache.org on 2018/10/15 21:01:26 UTC

[incubator-druid] branch master updated: SQL: Support for selecting multi-value dimensions. (#6462)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new f537c00  SQL: Support for selecting multi-value dimensions. (#6462)
f537c00 is described below

commit f537c0069a724c55161168ed8c7fc1e1d4b52293
Author: Gian Merlino <gi...@gmail.com>
AuthorDate: Mon Oct 15 14:01:21 2018 -0700

    SQL: Support for selecting multi-value dimensions. (#6462)
    
    * SQL: Support for selecting multi-value dimensions.
    
    Fixes #4637. Doesn't completely address everything mentioned in #4638,
    but at least fixes one issue on the way there.
    
    * Fix null cases in tests.
---
 .../apache/druid/sql/calcite/rel/QueryMaker.java   |  15 +++
 .../druid/sql/avatica/DruidAvaticaHandlerTest.java |   8 ++
 .../druid/sql/avatica/DruidStatementTest.java      |   1 +
 .../apache/druid/sql/calcite/CalciteQueryTest.java | 102 ++++++++++-----------
 .../druid/sql/calcite/http/SqlResourceTest.java    |  42 ++++++---
 .../druid/sql/calcite/util/CalciteTests.java       |  54 +++++++++--
 6 files changed, 145 insertions(+), 77 deletions(-)

diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/QueryMaker.java b/sql/src/main/java/org/apache/druid/sql/calcite/rel/QueryMaker.java
index 7b7a4d0..a04280e 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/QueryMaker.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/QueryMaker.java
@@ -61,13 +61,16 @@ import org.apache.druid.sql.calcite.planner.PlannerContext;
 import org.apache.druid.sql.calcite.table.RowSignature;
 import org.joda.time.DateTime;
 
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 public class QueryMaker
 {
@@ -424,6 +427,18 @@ public class QueryMaker
         coercedValue = ((NlsString) value).getValue();
       } else if (value instanceof Number) {
         coercedValue = String.valueOf(value);
+      } else if (value instanceof Collection) {
+        // Iterate through the collection, coercing each value. Useful for handling selects of multi-value dimensions.
+        final List<String> valueStrings = ((Collection<?>) value).stream()
+                                                                 .map(v -> (String) coerce(v, sqlType))
+                                                                 .collect(Collectors.toList());
+
+        try {
+          coercedValue = jsonMapper.writeValueAsString(valueStrings);
+        }
+        catch (IOException e) {
+          throw new RuntimeException(e);
+        }
       } else {
         throw new ISE("Cannot coerce[%s] to %s", value.getClass().getName(), sqlType);
       }
diff --git a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
index 4831421..dee3d2f 100644
--- a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
@@ -464,6 +464,14 @@ public class DruidAvaticaHandlerTest extends CalciteTestBase
             ROW(
                 Pair.of("TABLE_SCHEM", "druid"),
                 Pair.of("TABLE_NAME", "foo"),
+                Pair.of("COLUMN_NAME", "dim3"),
+                Pair.of("DATA_TYPE", Types.VARCHAR),
+                Pair.of("TYPE_NAME", "VARCHAR"),
+                Pair.of("IS_NULLABLE", "YES")
+            ),
+            ROW(
+                Pair.of("TABLE_SCHEM", "druid"),
+                Pair.of("TABLE_NAME", "foo"),
                 Pair.of("COLUMN_NAME", "m1"),
                 Pair.of("DATA_TYPE", Types.FLOAT),
                 Pair.of("TYPE_NAME", "FLOAT"),
diff --git a/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java b/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java
index 77a44dc..ce98b7f 100644
--- a/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java
@@ -127,6 +127,7 @@ public class DruidStatementTest extends CalciteTestBase
             Lists.newArrayList("cnt", "BIGINT", "java.lang.Long"),
             Lists.newArrayList("dim1", "VARCHAR", "java.lang.String"),
             Lists.newArrayList("dim2", "VARCHAR", "java.lang.String"),
+            Lists.newArrayList("dim3", "VARCHAR", "java.lang.String"),
             Lists.newArrayList("m1", "FLOAT", "java.lang.Float"),
             Lists.newArrayList("m2", "DOUBLE", "java.lang.Double"),
             Lists.newArrayList("unique_dim1", "OTHER", "java.lang.Object")
diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
index 81bb091..4316ec0 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
@@ -139,6 +139,8 @@ import java.util.Map;
 
 public class CalciteQueryTest extends CalciteTestBase
 {
+  private static final String NULL_VALUE = NullHandling.replaceWithDefault() ? "" : null;
+  private static final String HLLC_STRING = VersionOneHyperLogLogCollector.class.getName();
 
   private static final Logger log = new Logger(CalciteQueryTest.class);
 
@@ -535,6 +537,7 @@ public class CalciteQueryTest extends CalciteTestBase
             new Object[]{"cnt", "BIGINT", "NO"},
             new Object[]{"dim1", "VARCHAR", "YES"},
             new Object[]{"dim2", "VARCHAR", "YES"},
+            new Object[]{"dim3", "VARCHAR", "YES"},
             new Object[]{"m1", "FLOAT", "NO"},
             new Object[]{"m2", "DOUBLE", "NO"},
             new Object[]{"unique_dim1", "OTHER", "YES"}
@@ -623,26 +626,27 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testSelectStar() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
-    String hyperLogLogCollectorClassName = VersionOneHyperLogLogCollector.class.getName();
+    String hyperLogLogCollectorClassName = HLLC_STRING;
     testQuery(
         "SELECT * FROM druid.foo",
         ImmutableList.of(
             newScanQueryBuilder()
                 .dataSource(CalciteTests.DATASOURCE1)
                 .intervals(QSS(Filtration.eternity()))
-                .columns("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1")
+                .columns("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1")
                 .resultFormat(ScanQuery.RESULT_FORMAT_COMPACTED_LIST)
                 .context(QUERY_CONTEXT_DEFAULT)
                 .build()
         ),
         ImmutableList.of(
-            new Object[]{T("2000-01-01"), 1L, "", "a", 1f, 1.0, hyperLogLogCollectorClassName},
-            new Object[]{T("2000-01-02"), 1L, "10.1", nullValue, 2f, 2.0, hyperLogLogCollectorClassName},
-            new Object[]{T("2000-01-03"), 1L, "2", "", 3f, 3.0, hyperLogLogCollectorClassName},
-            new Object[]{T("2001-01-01"), 1L, "1", "a", 4f, 4.0, hyperLogLogCollectorClassName},
-            new Object[]{T("2001-01-02"), 1L, "def", "abc", 5f, 5.0, hyperLogLogCollectorClassName},
-            new Object[]{T("2001-01-03"), 1L, "abc", nullValue, 6f, 6.0, hyperLogLogCollectorClassName}
+            new Object[]{T("2000-01-01"), 1L, "", "a", "[\"a\",\"b\"]", 1f, 1.0, hyperLogLogCollectorClassName},
+            new Object[]{
+                T("2000-01-02"), 1L, "10.1", NULL_VALUE, "[\"b\",\"c\"]", 2f, 2.0, hyperLogLogCollectorClassName
+            },
+            new Object[]{T("2000-01-03"), 1L, "2", "", "d", 3f, 3.0, hyperLogLogCollectorClassName},
+            new Object[]{T("2001-01-01"), 1L, "1", "a", "", 4f, 4.0, hyperLogLogCollectorClassName},
+            new Object[]{T("2001-01-02"), 1L, "def", "abc", NULL_VALUE, 5f, 5.0, hyperLogLogCollectorClassName},
+            new Object[]{T("2001-01-03"), 1L, "abc", NULL_VALUE, NULL_VALUE, 6f, 6.0, hyperLogLogCollectorClassName}
         )
     );
   }
@@ -676,7 +680,7 @@ public class CalciteQueryTest extends CalciteTestBase
                 "abcd",
                 9999.0f,
                 NullHandling.defaultDoubleValue(),
-                VersionOneHyperLogLogCollector.class.getName()
+                HLLC_STRING
             }
         )
     );
@@ -710,7 +714,7 @@ public class CalciteQueryTest extends CalciteTestBase
         ImmutableList.of(),
         ImmutableList.of(
             new Object[]{
-                "DruidQueryRel(query=[{\"queryType\":\"scan\",\"dataSource\":{\"type\":\"table\",\"name\":\"foo\"},\"intervals\":{\"type\":\"intervals\",\"intervals\":[\"-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z\"]},\"virtualColumns\":[],\"resultFormat\":\"compactedList\",\"batchSize\":20480,\"limit\":9223372036854775807,\"filter\":null,\"columns\":[\"__time\",\"cnt\",\"dim1\",\"dim2\",\"m1\",\"m2\",\"unique_dim1\"],\"legacy\":false,\"context\":{\"defaultTimeout\":3000 [...]
+                "DruidQueryRel(query=[{\"queryType\":\"scan\",\"dataSource\":{\"type\":\"table\",\"name\":\"foo\"},\"intervals\":{\"type\":\"intervals\",\"intervals\":[\"-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z\"]},\"virtualColumns\":[],\"resultFormat\":\"compactedList\",\"batchSize\":20480,\"limit\":9223372036854775807,\"filter\":null,\"columns\":[\"__time\",\"cnt\",\"dim1\",\"dim2\",\"dim3\",\"m1\",\"m2\",\"unique_dim1\"],\"legacy\":false,\"context\":{\"defaultTimeo [...]
             }
         )
     );
@@ -719,23 +723,21 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testSelectStarWithLimit() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
-
     testQuery(
         "SELECT * FROM druid.foo LIMIT 2",
         ImmutableList.of(
             newScanQueryBuilder()
                 .dataSource(CalciteTests.DATASOURCE1)
                 .intervals(QSS(Filtration.eternity()))
-                .columns("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1")
+                .columns("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1")
                 .limit(2)
                 .resultFormat(ScanQuery.RESULT_FORMAT_COMPACTED_LIST)
                 .context(QUERY_CONTEXT_DEFAULT)
                 .build()
         ),
         ImmutableList.of(
-            new Object[]{T("2000-01-01"), 1L, "", "a", 1.0f, 1.0, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2000-01-02"), 1L, "10.1", nullValue, 2.0f, 2.0, VersionOneHyperLogLogCollector.class.getName()}
+            new Object[]{T("2000-01-01"), 1L, "", "a", "[\"a\",\"b\"]", 1.0f, 1.0, HLLC_STRING},
+            new Object[]{T("2000-01-02"), 1L, "10.1", NULL_VALUE, "[\"b\",\"c\"]", 2.0f, 2.0, HLLC_STRING}
         )
     );
   }
@@ -743,7 +745,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testSelectWithProjection() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
     testQuery(
         "SELECT SUBSTRING(dim2, 1, 1) FROM druid.foo LIMIT 2",
         ImmutableList.of(
@@ -761,7 +762,7 @@ public class CalciteQueryTest extends CalciteTestBase
         ),
         ImmutableList.of(
             new Object[]{"a"},
-            new Object[]{nullValue}
+            new Object[]{NULL_VALUE}
         )
     );
   }
@@ -769,8 +770,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testSelectStarWithLimitTimeDescending() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
-
     testQuery(
         "SELECT * FROM druid.foo ORDER BY __time DESC LIMIT 2",
         ImmutableList.of(
@@ -779,15 +778,15 @@ public class CalciteQueryTest extends CalciteTestBase
                   .intervals(QSS(Filtration.eternity()))
                   .granularity(Granularities.ALL)
                   .dimensions(ImmutableList.of("dummy"))
-                  .metrics(ImmutableList.of("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1"))
+                  .metrics(ImmutableList.of("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1"))
                   .descending(true)
                   .pagingSpec(FIRST_PAGING_SPEC)
                   .context(QUERY_CONTEXT_DEFAULT)
                   .build()
         ),
         ImmutableList.of(
-            new Object[]{T("2001-01-03"), 1L, "abc", nullValue, 6f, 6d, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2001-01-02"), 1L, "def", "abc", 5f, 5d, VersionOneHyperLogLogCollector.class.getName()}
+            new Object[]{T("2001-01-03"), 1L, "abc", NULL_VALUE, NULL_VALUE, 6f, 6d, HLLC_STRING},
+            new Object[]{T("2001-01-02"), 1L, "def", "abc", NULL_VALUE, 5f, 5d, HLLC_STRING}
         )
     );
   }
@@ -795,7 +794,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testSelectStarWithoutLimitTimeAscending() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
     testQuery(
         "SELECT * FROM druid.foo ORDER BY __time",
         ImmutableList.of(
@@ -804,7 +802,7 @@ public class CalciteQueryTest extends CalciteTestBase
                   .intervals(QSS(Filtration.eternity()))
                   .granularity(Granularities.ALL)
                   .dimensions(ImmutableList.of("dummy"))
-                  .metrics(ImmutableList.of("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1"))
+                  .metrics(ImmutableList.of("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1"))
                   .descending(false)
                   .pagingSpec(FIRST_PAGING_SPEC)
                   .context(QUERY_CONTEXT_DEFAULT)
@@ -814,7 +812,7 @@ public class CalciteQueryTest extends CalciteTestBase
                   .intervals(QSS(Filtration.eternity()))
                   .granularity(Granularities.ALL)
                   .dimensions(ImmutableList.of("dummy"))
-                  .metrics(ImmutableList.of("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1"))
+                  .metrics(ImmutableList.of("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1"))
                   .descending(false)
                   .pagingSpec(
                       new PagingSpec(
@@ -827,12 +825,12 @@ public class CalciteQueryTest extends CalciteTestBase
                   .build()
         ),
         ImmutableList.of(
-            new Object[]{T("2000-01-01"), 1L, "", "a", 1f, 1.0, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2000-01-02"), 1L, "10.1", nullValue, 2f, 2.0, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2000-01-03"), 1L, "2", "", 3f, 3.0, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2001-01-01"), 1L, "1", "a", 4f, 4.0, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2001-01-02"), 1L, "def", "abc", 5f, 5.0, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2001-01-03"), 1L, "abc", nullValue, 6f, 6.0, VersionOneHyperLogLogCollector.class.getName()}
+            new Object[]{T("2000-01-01"), 1L, "", "a", "[\"a\",\"b\"]", 1f, 1.0, HLLC_STRING},
+            new Object[]{T("2000-01-02"), 1L, "10.1", NULL_VALUE, "[\"b\",\"c\"]", 2f, 2.0, HLLC_STRING},
+            new Object[]{T("2000-01-03"), 1L, "2", "", "d", 3f, 3.0, HLLC_STRING},
+            new Object[]{T("2001-01-01"), 1L, "1", "a", "", 4f, 4.0, HLLC_STRING},
+            new Object[]{T("2001-01-02"), 1L, "def", "abc", NULL_VALUE, 5f, 5.0, HLLC_STRING},
+            new Object[]{T("2001-01-03"), 1L, "abc", NULL_VALUE, NULL_VALUE, 6f, 6.0, HLLC_STRING}
         )
     );
   }
@@ -840,7 +838,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testSelectSingleColumnTwice() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
     testQuery(
         "SELECT dim2 x, dim2 y FROM druid.foo LIMIT 2",
         ImmutableList.of(
@@ -855,7 +852,7 @@ public class CalciteQueryTest extends CalciteTestBase
         ),
         ImmutableList.of(
             new Object[]{"a", "a"},
-            new Object[]{nullValue, nullValue}
+            new Object[]{NULL_VALUE, NULL_VALUE}
         )
     );
   }
@@ -1497,7 +1494,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testGroupByWithSelectProjections() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
     testQuery(
         "SELECT\n"
         + "  dim1,"
@@ -1517,10 +1513,10 @@ public class CalciteQueryTest extends CalciteTestBase
                         .build()
         ),
         ImmutableList.of(
-            new Object[]{"", nullValue},
-            new Object[]{"1", nullValue},
+            new Object[]{"", NULL_VALUE},
+            new Object[]{"1", NULL_VALUE},
             new Object[]{"10.1", "0.1"},
-            new Object[]{"2", nullValue},
+            new Object[]{"2", NULL_VALUE},
             new Object[]{"abc", "bc"},
             new Object[]{"def", "ef"}
         )
@@ -1530,7 +1526,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testGroupByWithSelectAndOrderByProjections() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
     testQuery(
         "SELECT\n"
         + "  dim1,"
@@ -1570,9 +1565,9 @@ public class CalciteQueryTest extends CalciteTestBase
             new Object[]{"10.1", "0.1"},
             new Object[]{"abc", "bc"},
             new Object[]{"def", "ef"},
-            new Object[]{"1", nullValue},
-            new Object[]{"2", nullValue},
-            new Object[]{"", nullValue}
+            new Object[]{"1", NULL_VALUE},
+            new Object[]{"2", NULL_VALUE},
+            new Object[]{"", NULL_VALUE}
         )
     );
   }
@@ -1580,8 +1575,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testTopNWithSelectProjections() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
-
     testQuery(
         "SELECT\n"
         + "  dim1,"
@@ -1604,10 +1597,10 @@ public class CalciteQueryTest extends CalciteTestBase
                 .build()
         ),
         ImmutableList.of(
-            new Object[]{"", nullValue},
-            new Object[]{"1", nullValue},
+            new Object[]{"", NULL_VALUE},
+            new Object[]{"1", NULL_VALUE},
             new Object[]{"10.1", "0.1"},
-            new Object[]{"2", nullValue},
+            new Object[]{"2", NULL_VALUE},
             new Object[]{"abc", "bc"},
             new Object[]{"def", "ef"}
         )
@@ -1617,7 +1610,6 @@ public class CalciteQueryTest extends CalciteTestBase
   @Test
   public void testTopNWithSelectAndOrderByProjections() throws Exception
   {
-    String nullValue = NullHandling.replaceWithDefault() ? "" : null;
 
     testQuery(
         "SELECT\n"
@@ -1646,9 +1638,9 @@ public class CalciteQueryTest extends CalciteTestBase
             new Object[]{"10.1", "0.1"},
             new Object[]{"abc", "bc"},
             new Object[]{"def", "ef"},
-            new Object[]{"1", nullValue},
-            new Object[]{"2", nullValue},
-            new Object[]{"", nullValue}
+            new Object[]{"1", NULL_VALUE},
+            new Object[]{"2", NULL_VALUE},
+            new Object[]{"", NULL_VALUE}
         )
     );
   }
@@ -2126,15 +2118,15 @@ public class CalciteQueryTest extends CalciteTestBase
                         SELECTOR("dim2", "a", null)
                     )
                 )
-                .columns("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1")
+                .columns("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1")
                 .resultFormat(ScanQuery.RESULT_FORMAT_COMPACTED_LIST)
                 .context(QUERY_CONTEXT_DEFAULT)
                 .build()
         ),
         ImmutableList.of(
-            new Object[]{T("2000-01-01"), 1L, "", "a", 1.0f, 1.0d, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2001-01-01"), 1L, "1", "a", 4.0f, 4.0d, VersionOneHyperLogLogCollector.class.getName()},
-            new Object[]{T("2001-01-02"), 1L, "def", "abc", 5.0f, 5.0d, VersionOneHyperLogLogCollector.class.getName()}
+            new Object[]{T("2000-01-01"), 1L, "", "a", "[\"a\",\"b\"]", 1.0f, 1.0d, HLLC_STRING},
+            new Object[]{T("2001-01-01"), 1L, "1", "a", "", 4.0f, 4.0d, HLLC_STRING},
+            new Object[]{T("2001-01-02"), 1L, "def", "abc", NULL_VALUE, 5.0f, 5.0d, HLLC_STRING}
         )
     );
   }
diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/http/SqlResourceTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/http/SqlResourceTest.java
index 59374e3..ac0cc6e 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/http/SqlResourceTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/http/SqlResourceTest.java
@@ -262,6 +262,7 @@ public class SqlResourceTest extends CalciteTestBase
                 1,
                 "",
                 "a",
+                "[\"a\",\"b\"]",
                 1.0,
                 1.0,
                 "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -272,6 +273,7 @@ public class SqlResourceTest extends CalciteTestBase
                 1,
                 "10.1",
                 nullStr,
+                "[\"b\",\"c\"]",
                 2.0,
                 2.0,
                 "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -290,12 +292,13 @@ public class SqlResourceTest extends CalciteTestBase
 
     Assert.assertEquals(
         ImmutableList.of(
-            Arrays.asList("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1", "EXPR$7"),
+            Arrays.asList("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1", "EXPR$8"),
             Arrays.asList(
                 "2000-01-01T00:00:00.000Z",
                 1,
                 "",
                 "a",
+                "[\"a\",\"b\"]",
                 1.0,
                 1.0,
                 "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -306,6 +309,7 @@ public class SqlResourceTest extends CalciteTestBase
                 1,
                 "10.1",
                 nullStr,
+                "[\"b\",\"c\"]",
                 2.0,
                 2.0,
                 "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -331,6 +335,7 @@ public class SqlResourceTest extends CalciteTestBase
             1,
             "",
             "a",
+            "[\"a\",\"b\"]",
             1.0,
             1.0,
             "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -344,6 +349,7 @@ public class SqlResourceTest extends CalciteTestBase
             1,
             "10.1",
             nullStr,
+            "[\"b\",\"c\"]",
             2.0,
             2.0,
             "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -365,7 +371,7 @@ public class SqlResourceTest extends CalciteTestBase
 
     Assert.assertEquals(5, lines.size());
     Assert.assertEquals(
-        Arrays.asList("__time", "cnt", "dim1", "dim2", "m1", "m2", "unique_dim1", "EXPR$7"),
+        Arrays.asList("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1", "EXPR$8"),
         JSON_MAPPER.readValue(lines.get(0), List.class)
     );
     Assert.assertEquals(
@@ -374,6 +380,7 @@ public class SqlResourceTest extends CalciteTestBase
             1,
             "",
             "a",
+            "[\"a\",\"b\"]",
             1.0,
             1.0,
             "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -387,6 +394,7 @@ public class SqlResourceTest extends CalciteTestBase
             1,
             "10.1",
             nullStr,
+            "[\"b\",\"c\"]",
             2.0,
             2.0,
             "org.apache.druid.hll.VersionOneHyperLogLogCollector",
@@ -406,7 +414,7 @@ public class SqlResourceTest extends CalciteTestBase
     final Function<Map<String, Object>, Map<String, Object>> transformer = m -> {
       return Maps.transformEntries(
           m,
-          (k, v) -> "EXPR$7".equals(k) || ("dim2".equals(k) && v.toString().isEmpty()) ? nullStr : v
+          (k, v) -> "EXPR$8".equals(k) || ("dim2".equals(k) && v.toString().isEmpty()) ? nullStr : v
       );
     };
 
@@ -418,10 +426,11 @@ public class SqlResourceTest extends CalciteTestBase
                 .put("cnt", 1)
                 .put("dim1", "")
                 .put("dim2", "a")
+                .put("dim3", "[\"a\",\"b\"]")
                 .put("m1", 1.0)
                 .put("m2", 1.0)
                 .put("unique_dim1", "org.apache.druid.hll.VersionOneHyperLogLogCollector")
-                .put("EXPR$7", "")
+                .put("EXPR$8", "")
                 .build(),
             ImmutableMap
                 .<String, Object>builder()
@@ -429,10 +438,11 @@ public class SqlResourceTest extends CalciteTestBase
                 .put("cnt", 1)
                 .put("dim1", "10.1")
                 .put("dim2", "")
+                .put("dim3", "[\"b\",\"c\"]")
                 .put("m1", 2.0)
                 .put("m2", 2.0)
                 .put("unique_dim1", "org.apache.druid.hll.VersionOneHyperLogLogCollector")
-                .put("EXPR$7", "")
+                .put("EXPR$8", "")
                 .build()
         ).stream().map(transformer).collect(Collectors.toList()),
         doPost(
@@ -451,7 +461,7 @@ public class SqlResourceTest extends CalciteTestBase
     final Function<Map<String, Object>, Map<String, Object>> transformer = m -> {
       return Maps.transformEntries(
           m,
-          (k, v) -> "EXPR$7".equals(k) || ("dim2".equals(k) && v.toString().isEmpty()) ? nullStr : v
+          (k, v) -> "EXPR$8".equals(k) || ("dim2".equals(k) && v.toString().isEmpty()) ? nullStr : v
       );
     };
     final List<String> lines = Splitter.on('\n').splitToList(response);
@@ -465,10 +475,11 @@ public class SqlResourceTest extends CalciteTestBase
                 .put("cnt", 1)
                 .put("dim1", "")
                 .put("dim2", "a")
+                .put("dim3", "[\"a\",\"b\"]")
                 .put("m1", 1.0)
                 .put("m2", 1.0)
                 .put("unique_dim1", "org.apache.druid.hll.VersionOneHyperLogLogCollector")
-                .put("EXPR$7", "")
+                .put("EXPR$8", "")
                 .build()
         ),
         JSON_MAPPER.readValue(lines.get(0), Object.class)
@@ -481,10 +492,11 @@ public class SqlResourceTest extends CalciteTestBase
                 .put("cnt", 1)
                 .put("dim1", "10.1")
                 .put("dim2", "")
+                .put("dim3", "[\"b\",\"c\"]")
                 .put("m1", 2.0)
                 .put("m2", 2.0)
                 .put("unique_dim1", "org.apache.druid.hll.VersionOneHyperLogLogCollector")
-                .put("EXPR$7", "")
+                .put("EXPR$8", "")
                 .build()
         ),
         JSON_MAPPER.readValue(lines.get(1), Object.class)
@@ -502,8 +514,8 @@ public class SqlResourceTest extends CalciteTestBase
 
     Assert.assertEquals(
         ImmutableList.of(
-            "2000-01-01T00:00:00.000Z,1,,a,1.0,1.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
-            "2000-01-02T00:00:00.000Z,1,10.1,,2.0,2.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
+            "2000-01-01T00:00:00.000Z,1,,a,\"[\"\"a\"\",\"\"b\"\"]\",1.0,1.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
+            "2000-01-02T00:00:00.000Z,1,10.1,,\"[\"\"b\"\",\"\"c\"\"]\",2.0,2.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
             "",
             ""
         ),
@@ -520,9 +532,9 @@ public class SqlResourceTest extends CalciteTestBase
 
     Assert.assertEquals(
         ImmutableList.of(
-            "__time,cnt,dim1,dim2,m1,m2,unique_dim1,EXPR$7",
-            "2000-01-01T00:00:00.000Z,1,,a,1.0,1.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
-            "2000-01-02T00:00:00.000Z,1,10.1,,2.0,2.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
+            "__time,cnt,dim1,dim2,dim3,m1,m2,unique_dim1,EXPR$8",
+            "2000-01-01T00:00:00.000Z,1,,a,\"[\"\"a\"\",\"\"b\"\"]\",1.0,1.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
+            "2000-01-02T00:00:00.000Z,1,10.1,,\"[\"\"b\"\",\"\"c\"\"]\",2.0,2.0,org.apache.druid.hll.VersionOneHyperLogLogCollector,",
             "",
             ""
         ),
@@ -553,7 +565,7 @@ public class SqlResourceTest extends CalciteTestBase
   {
     final QueryInterruptedException exception = doPost(
         new SqlQuery(
-            "SELECT dim3 FROM druid.foo",
+            "SELECT dim4 FROM druid.foo",
             ResultFormat.OBJECT,
             false,
             null
@@ -563,7 +575,7 @@ public class SqlResourceTest extends CalciteTestBase
     Assert.assertNotNull(exception);
     Assert.assertEquals(QueryInterruptedException.UNKNOWN_EXCEPTION, exception.getErrorCode());
     Assert.assertEquals(ValidationException.class.getName(), exception.getErrorClass());
-    Assert.assertTrue(exception.getMessage().contains("Column 'dim3' not found in any table"));
+    Assert.assertTrue(exception.getMessage().contains("Column 'dim4' not found in any table"));
   }
 
   @Test
diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java b/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java
index 68ca422..8ba21cc 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java
@@ -249,7 +249,7 @@ public class CalciteTests
       new TimeAndDimsParseSpec(
           new TimestampSpec(TIMESTAMP_COLUMN, "iso", null),
           new DimensionsSpec(
-              DimensionsSpec.getDefaultSchemas(ImmutableList.of("dim1", "dim2")),
+              DimensionsSpec.getDefaultSchemas(ImmutableList.of("dim1", "dim2", "dim3")),
               null,
               null
           )
@@ -268,22 +268,62 @@ public class CalciteTests
 
   public static final List<InputRow> ROWS1 = ImmutableList.of(
       createRow(
-          ImmutableMap.of("t", "2000-01-01", "m1", "1.0", "m2", "1.0", "dim1", "", "dim2", ImmutableList.of("a"))
+          ImmutableMap.<String, Object>builder()
+              .put("t", "2000-01-01")
+              .put("m1", "1.0")
+              .put("m2", "1.0")
+              .put("dim1", "")
+              .put("dim2", ImmutableList.of("a"))
+              .put("dim3", ImmutableList.of("a", "b"))
+              .build()
       ),
       createRow(
-          ImmutableMap.of("t", "2000-01-02", "m1", "2.0", "m2", "2.0", "dim1", "10.1", "dim2", ImmutableList.of())
+          ImmutableMap.<String, Object>builder()
+              .put("t", "2000-01-02")
+              .put("m1", "2.0")
+              .put("m2", "2.0")
+              .put("dim1", "10.1")
+              .put("dim2", ImmutableList.of())
+              .put("dim3", ImmutableList.of("b", "c"))
+              .build()
       ),
       createRow(
-          ImmutableMap.of("t", "2000-01-03", "m1", "3.0", "m2", "3.0", "dim1", "2", "dim2", ImmutableList.of(""))
+          ImmutableMap.<String, Object>builder()
+              .put("t", "2000-01-03")
+              .put("m1", "3.0")
+              .put("m2", "3.0")
+              .put("dim1", "2")
+              .put("dim2", ImmutableList.of(""))
+              .put("dim3", ImmutableList.of("d"))
+              .build()
       ),
       createRow(
-          ImmutableMap.of("t", "2001-01-01", "m1", "4.0", "m2", "4.0", "dim1", "1", "dim2", ImmutableList.of("a"))
+          ImmutableMap.<String, Object>builder()
+              .put("t", "2001-01-01")
+              .put("m1", "4.0")
+              .put("m2", "4.0")
+              .put("dim1", "1")
+              .put("dim2", ImmutableList.of("a"))
+              .put("dim3", ImmutableList.of(""))
+              .build()
       ),
       createRow(
-          ImmutableMap.of("t", "2001-01-02", "m1", "5.0", "m2", "5.0", "dim1", "def", "dim2", ImmutableList.of("abc"))
+          ImmutableMap.<String, Object>builder()
+              .put("t", "2001-01-02")
+              .put("m1", "5.0")
+              .put("m2", "5.0")
+              .put("dim1", "def")
+              .put("dim2", ImmutableList.of("abc"))
+              .put("dim3", ImmutableList.of())
+              .build()
       ),
       createRow(
-          ImmutableMap.of("t", "2001-01-03", "m1", "6.0", "m2", "6.0", "dim1", "abc")
+          ImmutableMap.<String, Object>builder()
+              .put("t", "2001-01-03")
+              .put("m1", "6.0")
+              .put("m2", "6.0")
+              .put("dim1", "abc")
+              .build()
       )
   );
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org