[
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)