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 3548396  SQL: Update to Calcite 1.17.0. (#6404)
3548396 is described below

commit 3548396a45ec90dfe1db2a0ba3fc5b56fdd1861f
Author: Gian Merlino <[email protected]>
AuthorDate: Sat Sep 29 18:33:29 2018 -0700

    SQL: Update to Calcite 1.17.0. (#6404)
    
    * SQL: Update to Calcite 1.17.0.
    
    Other than keeping things fresh, another motivation is that
    this fixes CALCITE-1436 (AggregateNode NPE for aggregators other
    than SUM/COUNT), which affects aggregate functions on our system
    tables.
    
    Also sets shouldConvertRaggedUnionTypesToVarying = true, a new
    type system parameter that prefers VARCHAR over CHAR. This is
    better for Druid, because we don't really have support for a
    true CHAR type.
    
    * Remove unused import.
---
 pom.xml                                            |  2 +-
 .../druid/sql/calcite/planner/DruidTypeSystem.java |  6 +++
 .../org/apache/druid/sql/calcite/rel/DruidRel.java | 39 ++++++-----------
 .../sql/calcite/schema/InformationSchema.java      |  2 +-
 .../apache/druid/sql/calcite/CalciteQueryTest.java | 50 ++++++++++++++++------
 .../druid/sql/calcite/util/QueryLogHook.java       | 30 ++++++-------
 6 files changed, 71 insertions(+), 58 deletions(-)

diff --git a/pom.xml b/pom.xml
index 3185ec5..f81c21c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,7 +65,7 @@
         <apache.curator.version>4.0.0</apache.curator.version>
         <apache.curator.test.version>2.12.0</apache.curator.test.version>
         <avatica.version>1.10.0</avatica.version>
-        <calcite.version>1.15.0</calcite.version>
+        <calcite.version>1.17.0</calcite.version>
         <dropwizard.metrics.version>4.0.0</dropwizard.metrics.version>
         <fastutil.version>8.1.0</fastutil.version>
         <guava.version>16.0.1</guava.version>
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidTypeSystem.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidTypeSystem.java
index 2f6b868..867995a 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidTypeSystem.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidTypeSystem.java
@@ -135,4 +135,10 @@ public class DruidTypeSystem implements RelDataTypeSystem
   {
     return RelDataTypeSystem.DEFAULT.isSchemaCaseSensitive();
   }
+
+  @Override
+  public boolean shouldConvertRaggedUnionTypesToVarying()
+  {
+    return true;
+  }
 }
diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidRel.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidRel.java
index bbf332a..41cbe97 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidRel.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidRel.java
@@ -29,7 +29,6 @@ import org.apache.calcite.linq4j.Enumerable;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.AbstractRelNode;
-import org.apache.druid.java.util.common.guava.Accumulator;
 import org.apache.druid.java.util.common.guava.Sequence;
 import org.apache.druid.sql.calcite.planner.PlannerContext;
 
@@ -133,31 +132,19 @@ public abstract class DruidRel<T extends DruidRel> 
extends AbstractRelNode imple
   @Override
   public Node implement(InterpreterImplementor implementor)
   {
-    final Sink sink = implementor.interpreter.sink(this);
-    return new Node()
-    {
-      @Override
-      public void run()
-      {
-        runQuery().accumulate(
-            sink,
-            new Accumulator<Sink, Object[]>()
-            {
-              @Override
-              public Sink accumulate(final Sink theSink, final Object[] in)
-              {
-                try {
-                  theSink.send(Row.of(in));
-                }
-                catch (InterruptedException e) {
-                  throw Throwables.propagate(e);
-                }
-                return theSink;
-              }
-            }
-        );
-      }
-    };
+    final Sink sink = implementor.compiler.sink(this);
+    return () -> runQuery().accumulate(
+        sink,
+        (Sink theSink, Object[] in) -> {
+          try {
+            theSink.send(Row.of(in));
+          }
+          catch (InterruptedException e) {
+            throw Throwables.propagate(e);
+          }
+          return theSink;
+        }
+    );
   }
 
   @Override
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/schema/InformationSchema.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/schema/InformationSchema.java
index a0f336f..e8300df 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/schema/InformationSchema.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/schema/InformationSchema.java
@@ -413,7 +413,7 @@ public class InformationSchema extends AbstractSchema
                       isDateTime ? String.valueOf(type.getPrecision()) : null, 
// DATETIME_PRECISION
                       isCharacter ? type.getCharset().name() : null, // 
CHARACTER_SET_NAME
                       isCharacter ? type.getCollation().getCollationName() : 
null, // COLLATION_NAME
-                      type.getSqlTypeName().getJdbcOrdinal() // JDBC_TYPE 
(Druid extension)
+                      Long.valueOf(type.getSqlTypeName().getJdbcOrdinal()) // 
JDBC_TYPE (Druid extension)
                   };
                 }
               }
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 e0f48dc..dd04e43 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
@@ -142,7 +142,8 @@ public class CalciteQueryTest extends CalciteTestBase
   private static final Logger log = new Logger(CalciteQueryTest.class);
 
   private static final PlannerConfig PLANNER_CONFIG_DEFAULT = new 
PlannerConfig();
-  private static final PlannerConfig PLANNER_CONFIG_REQUIRE_TIME_CONDITION = 
new PlannerConfig() {
+  private static final PlannerConfig PLANNER_CONFIG_REQUIRE_TIME_CONDITION = 
new PlannerConfig()
+  {
     @Override
     public boolean isRequireTimeCondition()
     {
@@ -596,6 +597,20 @@ public class CalciteQueryTest extends CalciteTestBase
   }
 
   @Test
+  public void testMinOnInformationSchemaColumns() throws Exception
+  {
+    testQuery(
+        "SELECT MIN(JDBC_TYPE)\n"
+        + "FROM INFORMATION_SCHEMA.COLUMNS\n"
+        + "WHERE TABLE_SCHEMA = 'druid' AND TABLE_NAME = 'foo'",
+        ImmutableList.of(),
+        ImmutableList.of(
+            new Object[]{-5L}
+        )
+    );
+  }
+
+  @Test
   public void testSelectStar() throws Exception
   {
     String nullValue = NullHandling.replaceWithDefault() ? "" : null;
@@ -1795,11 +1810,11 @@ public class CalciteQueryTest extends CalciteTestBase
                                 "d0:v",
                                 "case_searched("
                                 + 
"(CAST(timestamp_extract(\"__time\",'DAY','UTC'), 'DOUBLE') == \"m1\"),"
-                                + "'match-m1 ',"
+                                + "'match-m1',"
                                 + "(timestamp_extract(\"__time\",'DAY','UTC') 
== \"cnt\"),"
                                 + "'match-cnt',"
                                 + "(timestamp_extract(\"__time\",'DAY','UTC') 
== 0),"
-                                + "'zero     ',"
+                                + "'zero',"
                                 + DruidExpression.nullLiteral() + ")",
                                 ValueType.STRING
                             )
@@ -1812,7 +1827,7 @@ public class CalciteQueryTest extends CalciteTestBase
         ImmutableList.of(
             new Object[]{NullHandling.defaultStringValue(), 2L},
             new Object[]{"match-cnt", 1L},
-            new Object[]{"match-m1 ", 3L}
+            new Object[]{"match-m1", 3L}
         )
     );
   }
@@ -3150,13 +3165,21 @@ public class CalciteQueryTest extends CalciteTestBase
                   .dataSource(CalciteTests.DATASOURCE1)
                   .intervals(QSS(Filtration.eternity()))
                   .granularity(Granularities.ALL)
-                  .filters(SELECTOR("dim2", "a", null))
+                  .filters(
+                      AND(
+                          SELECTOR("dim2", "a", null),
+                          OR(
+                              BOUND("dim1", "a", null, true, false, null, 
StringComparators.LEXICOGRAPHIC),
+                              NOT(SELECTOR("dim1", null, null))
+                          )
+                      )
+                  )
                   .aggregators(AGGS(new CountAggregatorFactory("a0")))
                   .context(TIMESERIES_CONTEXT_DEFAULT)
                   .build()
         ),
         ImmutableList.of(
-            new Object[]{2L}
+            new Object[]{NullHandling.sqlCompatible() ? 2L : 1L}
         )
     );
   }
@@ -6856,7 +6879,7 @@ public class CalciteQueryTest extends CalciteTestBase
     final String explanation =
         "BindableSort(sort0=[$1], dir0=[ASC])\n"
         + "  BindableAggregate(group=[{0, 1}], EXPR$2=[COUNT()])\n"
-        + "    BindableFilter(condition=[OR(=($0, 'xxx'), CAST(AND(IS NOT 
NULL($4), <>($2, 0))):BOOLEAN)])\n"
+        + "    BindableFilter(condition=[OR(=($0, 'xxx'), CAST(AND(IS NOT 
NULL($4), <>($2, 0), IS NOT NULL($1))):BOOLEAN)])\n"
         + "      BindableJoin(condition=[=($1, $3)], joinType=[left])\n"
         + "        BindableJoin(condition=[true], joinType=[inner])\n"
         + "          
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\":[\"dim1\",\"dim2\"],\"legacy\":false,\"context\":{\"defaultTimeout\":300000,\"maxScatterGatherBytes\":9223372036854775
 [...]
@@ -7508,7 +7531,10 @@ public class CalciteQueryTest extends CalciteTestBase
                             new QueryDataSource(
                                 GroupByQuery.builder()
                                             
.setDataSource(CalciteTests.DATASOURCE1)
-                                            
.setInterval(QSS(Intervals.utc(DateTimes.of("2000-01-01").getMillis(), 
JodaUtils.MAX_INSTANT)))
+                                            .setInterval(QSS(Intervals.utc(
+                                                
DateTimes.of("2000-01-01").getMillis(),
+                                                JodaUtils.MAX_INSTANT
+                                            )))
                                             .setGranularity(Granularities.ALL)
                                             .setDimensions(DIMS(new 
DefaultDimensionSpec("dim2", "d0")))
                                             .setAggregatorSpecs(AGGS(new 
LongSumAggregatorFactory("a0", "cnt")))
@@ -7561,10 +7587,10 @@ public class CalciteQueryTest extends CalciteTestBase
                   
.intervals(QSS(Intervals.utc(DateTimes.of("2000-01-01").getMillis(), 
JodaUtils.MAX_INSTANT)))
                   .granularity(Granularities.ALL)
                   .filters(IN(
-                            "dim2",
-                            ImmutableList.of("1", "2", "a", "d"),
-                            new SubstringDimExtractionFn(0, 1)
-                        ))
+                      "dim2",
+                      ImmutableList.of("1", "2", "a", "d"),
+                      new SubstringDimExtractionFn(0, 1)
+                  ))
                   .aggregators(AGGS(new CountAggregatorFactory("a0")))
                   .context(TIMESERIES_CONTEXT_DEFAULT)
                   .build()
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryLogHook.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryLogHook.java
index 0faddca..c68dbc8 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryLogHook.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryLogHook.java
@@ -20,18 +20,18 @@
 package org.apache.druid.sql.calcite.util;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import org.apache.calcite.runtime.Hook;
 import org.apache.druid.jackson.DefaultObjectMapper;
 import org.apache.druid.java.util.common.logger.Logger;
 import org.apache.druid.query.Query;
-import org.apache.calcite.runtime.Hook;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
 import java.util.List;
+import java.util.function.Consumer;
 
 /**
  * JUnit Rule that adds a Calcite hook to log and remember Druid queries.
@@ -78,22 +78,16 @@ public class QueryLogHook implements TestRule
       {
         clearRecordedQueries();
 
-        final Function<Object, Object> function = new Function<Object, 
Object>()
-        {
-          @Override
-          public Object apply(final Object query)
-          {
-            try {
-              recordedQueries.add((Query) query);
-              log.info(
-                  "Issued query: %s",
-                  
objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(query)
-              );
-            }
-            catch (Exception e) {
-              log.warn(e, "Failed to serialize query: %s", query);
-            }
-            return null;
+        final Consumer<Object> function = query -> {
+          try {
+            recordedQueries.add((Query) query);
+            log.info(
+                "Issued query: %s",
+                
objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(query)
+            );
+          }
+          catch (Exception e) {
+            log.warn(e, "Failed to serialize query: %s", query);
           }
         };
 


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

Reply via email to