[
https://issues.apache.org/jira/browse/CALCITE-1054?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Frankie Bollaert updated CALCITE-1054:
--------------------------------------
Description:
Problem occurs when:
Execute a query containing 2 checks on a Timestamp field
Table contains records which have NULL values for this field
Example query:
{code}
select * from aTable where aTimestamp > timestamp '2015-1-1 00:00:00' and
aTimestamp < timestamp '2015-2-1 00:00:00';
{code}
{code}
/* 48 */ public boolean moveNext() {
/* 49 */ while (inputEnumerator.moveNext()) {
/* 50 */ final java.sql.Timestamp inp23_ = (java.sql.Timestamp)
((Object[]) inputEnumerator.current())[23];
/* 51 */ final long v =
org.apache.calcite.runtime.SqlFunctions.toLong(inp23_);
/* 52 */ if (inp23_ != null && v > 1420070400000L && (inp23_ != null &&
v < 1422748800000L)) {
/* 53 */ return true;
/* 54 */ }
/* 55 */ }
/* 56 */ return false;
/* 57 */ }
{code}
Stack trace snippet
{code}
Caused by: java.lang.NullPointerException
at
org.apache.calcite.runtime.SqlFunctions.toLong(SqlFunctions.java:1094)
at
org.apache.calcite.runtime.SqlFunctions.toLong(SqlFunctions.java:1089)
at Baz$1$1.moveNext(ANONYMOUS.java:51)
at
org.apache.calcite.linq4j.Linq4j$EnumeratorIterator.<init>(Linq4j.java:677)
at org.apache.calcite.linq4j.Linq4j.enumeratorIterator(Linq4j.java:103)
{code}
The generated code also looks wrong for date fields.
{code}
/* 15 */ public boolean moveNext() {
/* 16 */ while (inputEnumerator.moveNext()) {
/* 17 */ final java.sql.Date current = (java.sql.Date)
inputEnumerator.current();
/* 18 */ final int v =
org.apache.calcite.runtime.SqlFunctions.toInt(current);
/* 19 */ if (current != null && v > 2780 && (current != null && v <
5290)) {
/* 20 */ return true;
/* 21 */ }
/* 22 */ }
/* 23 */ return false;
/* 24 */ }
{code}
Other types of fields do not have this problem. Below is what the generated
code looks like in the case of a String field. On line 20 there is a null
check. This is the type of check that needs to be generated for Datetime
fields as well.
{code}
select empno from sales.emps where gender > 'A' and gender < 'Z';
{code}
{code}
/* 17 */ public boolean moveNext() {
/* 18 */ while (inputEnumerator.moveNext()) {
/* 19 */ final Object[] current = (Object[]) inputEnumerator.current();
/* 20 */ final String inp3_ = current[3] == null ? (String) null :
current[3].toString();
/* 21 */ if (inp3_ != null &&
org.apache.calcite.runtime.SqlFunctions.gt(inp3_,
$L4J$C$org_apache_calcite_runtime_SqlFunctions_rtrim_A_) && (inp3_ != null &&
org.apache.calcite.runtime.SqlFunctions.lt(inp3_,
$L4J$C$org_apache_calcite_runtime_SqlFunctions_rtrim_Z_))) {
/* 22 */ return true;
/* 23 */ }
/* 24 */ }
/* 25 */ return false;
/* 26 */ }
{code}
was:
Problem occurs when:
Execute a query containing 2 checks on a Timestamp field
Table contains records which have NULL values for this field
Example query:
{code}
select * from aTable where aTimestamp > timestamp '2015-1-1 00:00:00' and
aTimestamp < timestamp '2015-2-1 00:00:00';
{code}
{code}
/* 48 */ public boolean moveNext() {
/* 49 */ while (inputEnumerator.moveNext()) {
/* 50 */ final java.sql.Timestamp inp23_ = (java.sql.Timestamp)
((Object[]) inputEnumerator.current())[23];
/* 51 */ final long v =
org.apache.calcite.runtime.SqlFunctions.toLong(inp23_);
/* 52 */ if (inp23_ != null && v > 1420070400000L && (inp23_ != null &&
v < 1422748800000L)) {
/* 53 */ return true;
/* 54 */ }
/* 55 */ }
/* 56 */ return false;
/* 57 */ }
{code}
Stack trace snippet
{code}
Caused by: java.lang.NullPointerException
at
org.apache.calcite.runtime.SqlFunctions.toLong(SqlFunctions.java:1094)
at
org.apache.calcite.runtime.SqlFunctions.toLong(SqlFunctions.java:1089)
at Baz$1$1.moveNext(ANONYMOUS.java:51)
at
org.apache.calcite.linq4j.Linq4j$EnumeratorIterator.<init>(Linq4j.java:677)
at org.apache.calcite.linq4j.Linq4j.enumeratorIterator(Linq4j.java:103)
{code}
The generated code also looks wrong for date fields.
{code}
/* 15 */ public boolean moveNext() {
/* 16 */ while (inputEnumerator.moveNext()) {
/* 17 */ final java.sql.Date current = (java.sql.Date)
inputEnumerator.current();
/* 18 */ final int v =
org.apache.calcite.runtime.SqlFunctions.toInt(current);
/* 19 */ if (current != null && v > 2780 && (current != null && v <
5290)) {
/* 20 */ return true;
/* 21 */ }
/* 22 */ }
/* 23 */ return false;
/* 24 */ }
{code}
Other types of fields do not have this problem. Below is what the generated
code looks like in the case of a String field. On line 20 there is a null
check. This is the type of check that needs to be generated for Datetime
fields as well.
{code}
select empno from sales.emps where gender > 'A' and gender < 'Z';
{code}
{code}
/* 17 */ public boolean moveNext() {
/* 18 */ while (inputEnumerator.moveNext()) {
/* 19 */ final Object[] current = (Object[]) inputEnumerator.current();
/* 20 */ final String inp3_ = current[3] == null ? (String) null :
current[3].toString();
/* 21 */ if (inp3_ != null &&
org.apache.calcite.runtime.SqlFunctions.gt(inp3_,
$L4J$C$org_apache_calcite_runtime_SqlFunctions_rtrim_A_) && (inp3_ != null &&
org.apache.calcite.runtime.SqlFunctions.lt(inp3_,
$L4J$C$org_apache_calcite_runtime_SqlFunctions_rtrim_Z_))) {
/* 22 */ return true;
/* 23 */ }
/* 24 */ }
/* 25 */ return false;
/* 26 */ }
{code}
> NPE caused by wrong code generation for Timestamp fields
> --------------------------------------------------------
>
> Key: CALCITE-1054
> URL: https://issues.apache.org/jira/browse/CALCITE-1054
> Project: Calcite
> Issue Type: Bug
> Components: core
> Reporter: Frankie Bollaert
> Assignee: Julian Hyde
> Priority: Minor
>
> Problem occurs when:
> Execute a query containing 2 checks on a Timestamp field
> Table contains records which have NULL values for this field
> Example query:
> {code}
> select * from aTable where aTimestamp > timestamp '2015-1-1 00:00:00' and
> aTimestamp < timestamp '2015-2-1 00:00:00';
> {code}
> {code}
> /* 48 */ public boolean moveNext() {
> /* 49 */ while (inputEnumerator.moveNext()) {
> /* 50 */ final java.sql.Timestamp inp23_ = (java.sql.Timestamp)
> ((Object[]) inputEnumerator.current())[23];
> /* 51 */ final long v =
> org.apache.calcite.runtime.SqlFunctions.toLong(inp23_);
> /* 52 */ if (inp23_ != null && v > 1420070400000L && (inp23_ != null
> && v < 1422748800000L)) {
> /* 53 */ return true;
> /* 54 */ }
> /* 55 */ }
> /* 56 */ return false;
> /* 57 */ }
> {code}
> Stack trace snippet
> {code}
> Caused by: java.lang.NullPointerException
> at
> org.apache.calcite.runtime.SqlFunctions.toLong(SqlFunctions.java:1094)
> at
> org.apache.calcite.runtime.SqlFunctions.toLong(SqlFunctions.java:1089)
> at Baz$1$1.moveNext(ANONYMOUS.java:51)
> at
> org.apache.calcite.linq4j.Linq4j$EnumeratorIterator.<init>(Linq4j.java:677)
> at org.apache.calcite.linq4j.Linq4j.enumeratorIterator(Linq4j.java:103)
> {code}
> The generated code also looks wrong for date fields.
> {code}
> /* 15 */ public boolean moveNext() {
> /* 16 */ while (inputEnumerator.moveNext()) {
> /* 17 */ final java.sql.Date current = (java.sql.Date)
> inputEnumerator.current();
> /* 18 */ final int v =
> org.apache.calcite.runtime.SqlFunctions.toInt(current);
> /* 19 */ if (current != null && v > 2780 && (current != null && v <
> 5290)) {
> /* 20 */ return true;
> /* 21 */ }
> /* 22 */ }
> /* 23 */ return false;
> /* 24 */ }
> {code}
> Other types of fields do not have this problem. Below is what the generated
> code looks like in the case of a String field. On line 20 there is a null
> check. This is the type of check that needs to be generated for Datetime
> fields as well.
> {code}
> select empno from sales.emps where gender > 'A' and gender < 'Z';
> {code}
> {code}
> /* 17 */ public boolean moveNext() {
> /* 18 */ while (inputEnumerator.moveNext()) {
> /* 19 */ final Object[] current = (Object[]) inputEnumerator.current();
> /* 20 */ final String inp3_ = current[3] == null ? (String) null :
> current[3].toString();
> /* 21 */ if (inp3_ != null &&
> org.apache.calcite.runtime.SqlFunctions.gt(inp3_,
> $L4J$C$org_apache_calcite_runtime_SqlFunctions_rtrim_A_) && (inp3_ != null &&
> org.apache.calcite.runtime.SqlFunctions.lt(inp3_,
> $L4J$C$org_apache_calcite_runtime_SqlFunctions_rtrim_Z_))) {
> /* 22 */ return true;
> /* 23 */ }
> /* 24 */ }
> /* 25 */ return false;
> /* 26 */ }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)