Jinfeng Ni created DRILL-3702:
---------------------------------
Summary: PartitionPruning hit ClassCastException in Interpreter
when the pruning filter expression is of non-nullable type.
Key: DRILL-3702
URL: https://issues.apache.org/jira/browse/DRILL-3702
Project: Apache Drill
Issue Type: Bug
Components: Query Planning & Optimization
Reporter: Jinfeng Ni
Assignee: Jinfeng Ni
Fix For: 1.2.0
I have the following parquet table, created using partition by clause:
{code}
create table mypart (id, name) partition by (id) as select cast(n_regionkey as
varchar(20)), n_name from cp.`tpch/nation.parquet`;
{code}
The generated parquet table consists of 5 files, each representing a partition:
{code}
0_0_1.parquet 0_0_2.parquet 0_0_3.parquet 0_0_4.parquet 0_0_5.parquet
{code}
For the following query, partition pruning works as expected:
{code}
select id, name from mypart where id = '0' ;
00-01 Project(id=[$1], name=[$0])
00-02 Scan(groupscan=[ParquetGroupScan [entries=[ReadEntryWithPath
[path=/tmp/mypart/0_0_1.parquet]], selectionRoot=file:/tmp/mypart, numFiles=1,
columns=[`id`, `name`]]])
"selectionRoot" : "file:/tmp/mypart",
"fileSet" : [ "/tmp/mypart/0_0_1.parquet" ],
"cost" : 5.0
{code}
However, the following query would hit ClassCastException when PruneScanRule
calls interpreter to evaluate the filtering condition, which happens to be
non-nullable.
{code}
select id, name from mypart where concat(id,'') = '0' ;
00-05 Project(id=[$1], name=[$0])
00-06 Scan(groupscan=[ParquetGroupScan
[entries=[ReadEntryWithPath [path=file:/tmp/mypart]],
selectionRoot=file:/tmp/mypart, numFiles=1, columns=[`id`, `name`]]])
"selectionRoot" : "file:/tmp/mypart",
"fileSet" : [ "/tmp/mypart/0_0_1.parquet", "/tmp/mypart/0_0_4.parquet",
"/tmp/mypart/0_0_5.parquet", "/tmp/mypart/0_0_2.parquet",
"/tmp/mypart/0_0_3.parquet" ],
"cost" : 25.0
},
{code}
Here is the error for the ClassCastException, raised in Interpreter:
{code}
java.lang.ClassCastException: org.apache.drill.exec.expr.holders.BitHolder
cannot be cast to org.apache.drill.exec.expr.holders.NullableBitHolder
{code}
The cause of the problem is that PruneScanRule assumes the output type of a
filter condition is NullableBit, while in this case the filter condition is Bit
type, which leads to ClassCastException.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)