[ 
https://issues.apache.org/jira/browse/DRILL-4984?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15681063#comment-15681063
 ] 

Holger Kiel commented on DRILL-4984:
------------------------------------

You are probably right. One shouldn't leave "conatins" uninitialized. And there 
is another potential problem with a Null pointer later on. The following 
modifications work at least for me:
{code}
--- 
drill/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/FindHardDistributionScans.java
        2016-08-20 08:04:52.000000000 +0200
+++ 
drill-new/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/FindHardDistributionScans.java
    2016-11-20 11:35:27.962504718 +0100
@@ -21,6 +21,7 @@
 import org.apache.calcite.rel.RelShuttleImpl;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.drill.common.exceptions.DrillRuntimeException;
+import org.apache.drill.exec.physical.base.GroupScan;
 import org.apache.drill.exec.planner.fragment.DistributionAffinity;
 import org.apache.drill.exec.planner.logical.DrillTable;
 import org.apache.drill.exec.planner.logical.DrillTranslatableTable;
@@ -31,7 +32,7 @@
  * Visitor to scan the RelNode tree and find if it contains any Scans that 
require hard distribution requirements.
  */
 class FindHardDistributionScans extends RelShuttleImpl {
-  private boolean contains;
+  private boolean contains = false;
 
   /**
    * Can the given <code>relTree</code> be executed in single fragment mode? 
For now this returns false when the
@@ -50,17 +51,28 @@
   @Override
   public RelNode visit(TableScan scan) {
     DrillTable unwrap;
+    DrillTranslatableTable unwrap2;
+    GroupScan groupScan;
+
     unwrap = scan.getTable().unwrap(DrillTable.class);
     if (unwrap == null) {
-      unwrap = 
scan.getTable().unwrap(DrillTranslatableTable.class).getDrillTable();
+      unwrap2 = scan.getTable().unwrap(DrillTranslatableTable.class);
+      if(unwrap2 != null)  {
+        unwrap = unwrap2.getDrillTable();
+      }
     }
 
-    try {
-      if (unwrap.getGroupScan().getDistributionAffinity() == 
DistributionAffinity.HARD) {
-        contains = true;
+    if (unwrap != null) {
+      try {
+        groupScan = unwrap.getGroupScan();
+        if (groupScan != null) {
+          if (groupScan.getDistributionAffinity() == 
DistributionAffinity.HARD) {
+            contains = true;
+          }
+        }
+      } catch (final IOException e) {
+        throw new DrillRuntimeException("Failed to get GroupScan from table.");
       }
-    } catch (final IOException e) {
-      throw new DrillRuntimeException("Failed to get GroupScan from table.");
     }
     return scan;
   }
{code}

> Limit 0 raises NullPointerException on JDBC storage sources
> -----------------------------------------------------------
>
>                 Key: DRILL-4984
>                 URL: https://issues.apache.org/jira/browse/DRILL-4984
>             Project: Apache Drill
>          Issue Type: Bug
>          Components: Query Planning & Optimization
>    Affects Versions: 1.8.0, 1.9.0
>         Environment: Latest 1.9 Snapshot, also 1.8 release version,
> mysql-connector-java-5.1.30, mysql-connector-java-5.1.40
>            Reporter: Holger Kiel
>
> NullPointerExceptions occur when a query with 'limit 0' is executed on a jdbc 
> storage source (e.g. Mysql):
> {code}
> 0: jdbc:drill:zk=local> select * from mysql.sugarcrm.sales_person limit 0;
> Error: SYSTEM ERROR: NullPointerException
> [Error Id: 6cd676fc-6db9-40b3-81d5-c2db044aeb77 on localhost:31010]
>   (org.apache.drill.exec.work.foreman.ForemanException) Unexpected exception 
> during fragment initialization: null
>     org.apache.drill.exec.work.foreman.Foreman.run():281
>     java.util.concurrent.ThreadPoolExecutor.runWorker():1142
>     java.util.concurrent.ThreadPoolExecutor$Worker.run():617
>     java.lang.Thread.run():745
>   Caused By (java.lang.NullPointerException) null
>     
> org.apache.drill.exec.planner.sql.handlers.FindHardDistributionScans.visit():55
>     org.apache.calcite.rel.core.TableScan.accept():166
>     org.apache.calcite.rel.RelShuttleImpl.visitChild():53
>     org.apache.calcite.rel.RelShuttleImpl.visitChildren():68
>     org.apache.calcite.rel.RelShuttleImpl.visit():126
>     org.apache.calcite.rel.AbstractRelNode.accept():256
>     org.apache.calcite.rel.RelShuttleImpl.visitChild():53
>     org.apache.calcite.rel.RelShuttleImpl.visitChildren():68
>     org.apache.calcite.rel.RelShuttleImpl.visit():126
>     org.apache.calcite.rel.AbstractRelNode.accept():256
>     
> org.apache.drill.exec.planner.sql.handlers.FindHardDistributionScans.canForceSingleMode():45
>     
> org.apache.drill.exec.planner.sql.handlers.DefaultSqlHandler.convertToDrel():262
>     
> org.apache.drill.exec.planner.sql.handlers.DefaultSqlHandler.convertToDrel():290
>     org.apache.drill.exec.planner.sql.handlers.DefaultSqlHandler.getPlan():168
>     org.apache.drill.exec.planner.sql.DrillSqlWorker.getPhysicalPlan():123
>     org.apache.drill.exec.planner.sql.DrillSqlWorker.getPlan():97
>     org.apache.drill.exec.work.foreman.Foreman.runSQL():1008
>     org.apache.drill.exec.work.foreman.Foreman.run():264
>     java.util.concurrent.ThreadPoolExecutor.runWorker():1142
>     java.util.concurrent.ThreadPoolExecutor$Worker.run():617
>     java.lang.Thread.run():745 (state=,code=0)
> 0: jdbc:drill:zk=local> select * from mysql.sugarcrm.sales_person limit 1;
> +-----+-------------+----------------+------------+-------------+
> | id  | first_name  |   last_name    | full_name  | manager_id  |
> +-----+-------------+----------------+------------+-------------+
> | 1   | null        | Administrator  | admin      | 0           |
> +-----+-------------+----------------+------------+-------------+
> 1 row selected (0,235 seconds)
> {code}
> Other datasources are okay:
> {code}
> 0: jdbc:drill:zk=local> SELECT * FROM cp.`employee.json` LIMIT 0;
> +------+-----------+-----------+---------+--------------+------------+-------------+------------+--------------+-----------------+-----------+----------------+-------------+------------+---------+----------------+------------------+-----------------+---------+------------------+
> | fqn  | filename  | filepath  | suffix  | employee_id  | full_name  | 
> first_name  | last_name  | position_id  | position_title  | store_id  | 
> department_id  | birth_date  | hire_date  | salary  | supervisor_id  | 
> education_level  | marital_status  | gender  | management_role  |
> +------+-----------+-----------+---------+--------------+------------+-------------+------------+--------------+-----------------+-----------+----------------+-------------+------------+---------+----------------+------------------+-----------------+---------+------------------+
> +------+-----------+-----------+---------+--------------+------------+-------------+------------+--------------+-----------------+-----------+----------------+-------------+------------+---------+----------------+------------------+-----------------+---------+------------------+
> No rows selected (0,309 seconds)
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to