You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Maryann Xue (JIRA)" <ji...@apache.org> on 2018/01/12 21:46:00 UTC

[jira] [Comment Edited] (CALCITE-1054) NPE caused by wrong code generation for Timestamp fields

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

Maryann Xue edited comment on CALCITE-1054 at 1/12/18 9:45 PM:
---------------------------------------------------------------

After verifying CALCITE-1118 along with CALCITE-1427 and this issue, I found that the issue also exists with Date/Time related functions. These functions are implemented by {{NotNullImplementor}} which will use their operands in primitive forms directly. So the solution should be unboxing the operands beforehand and meanwhile make sure the unboxed Parameters are handled properly, which means to call {{RexToLixTranslator.handleNull()}} on the operands when necessary. I've made extra check-ins in the PR to reflect this change.


was (Author: maryannxue):
After verifying CALCITE-1118 along with CALCITE-1427 and this issue, I found that the issue also exists with Date/Time related functions. These functions are implemented by {{NotNullImplementor}}s which will use their operands in primitive forms directly. So the solution should be unboxing the operands beforehand and meanwhile make sure the unboxed Parameters are handled properly, which means to call {{RexToLixTranslator.handleNull()}} on the operands when necessary. I've made extra check-ins in the PR to reflect this change.

> 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
>    Affects Versions: 1.6.0, 1.5.0, 1.4.0-incubating
>            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 Timestamp 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.4.14#64029)