Druid: Limit clause in the Inner query can cause NullPointerException

Created on 29 Oct 2019  路  1Comment  路  Source: apache/druid

If we run below query it fails with UnknownException/NullPointerException in the UI

SELECT COUNT(*) AS "count","colB"
   FROM (
        SELECT "channel" AS "colB"
        FROM (
            SELECT *
                FROM "wikiticker-Hour"
           limit 100     
        ) tmpA
        ) tmpA

   GROUP BY colB

BROKER log show below trace:

java.lang.NullPointerException
    at org.apache.druid.sql.calcite.rel.QueryMaker.findInnerMostQuery(QueryMaker.java:122) ~[druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at org.apache.druid.sql.calcite.rel.QueryMaker.runQuery(QueryMaker.java:98) ~[druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at org.apache.druid.sql.calcite.rel.DruidOuterQueryRel.runQuery(DruidOuterQueryRel.java:96) ~[druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at org.apache.druid.sql.calcite.planner.DruidPlanner$1.get(DruidPlanner.java:138) ~[druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at org.apache.druid.sql.calcite.planner.DruidPlanner$1.get(DruidPlanner.java:133) ~[druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at org.apache.druid.sql.calcite.planner.PlannerResult.run(PlannerResult.java:54) ~[druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at org.apache.druid.sql.SqlLifecycle.execute(SqlLifecycle.java:230) ~[druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at org.apache.druid.sql.http.SqlResource.doPost(SqlResource.java:108) [druid-sql-0.16.0-incubating.jar:0.16.0-incubating]
    at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source) ~[?:?]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_211]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_211]
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) [jersey-server-1.19.3.jar:1.19.3]
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) [jersey-server-1.19.3.jar:1.19.3]
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) [jersey-server-1.19.3.jar:1.19.3]

What is causing this :

https://github.com/apache/incubator-druid/blob/0.16.0-incubating/sql/src/main/java/org/apache/druid/sql/calcite/rel/QueryMaker.java

  private Query findInnerMostQuery(Query outerQuery)
  {
    Query query = outerQuery;
 #Line 122 while (query.getDataSource() instanceof QueryDataSource) {
      query = ((QueryDataSource) query.getDataSource()).getQuery();
    }
    return query;
  }

It seems it is not able to compute the inner query when limit is placed into the inner queries

Affected Version

Druid 0.16

Description

as described above

WorkAround (actually not a workaround, but something which works ):
If we remove the LIMIT clause from the query it works. i.e Below query works without any issue.

SELECT COUNT(*) AS "count","colB"
   FROM (
        SELECT "channel" AS "colB"
        FROM (
            SELECT *
                FROM "wikiticker-Hour"    
        ) tmpA
        ) tmpA

   GROUP BY colB
Area - SQL Bug

Most helpful comment

@vaibhav-imply Thanks for reporting this. I will propose a PR to solve it.

>All comments

@vaibhav-imply Thanks for reporting this. I will propose a PR to solve it.

Was this page helpful?
0 / 5 - 0 ratings