[
https://issues.apache.org/jira/browse/CALCITE-3536?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stamatis Zampetakis resolved CALCITE-3536.
------------------------------------------
Fix Version/s: 1.22.0
Resolution: Fixed
Fixed in
[0e16fe375f797e498c0039fc7cffecfd0dc9bc3d|https://github.com/apache/calcite/commit/0e16fe375f797e498c0039fc7cffecfd0dc9bc3d].
I simplified a bit the test and changed the commit message to be easier to
understand by people that are not familiar with Calcite internals. Thanks for
the PR [[email protected]]!
> NPE when executing plan with Coalesce due to wrong NullAs strategy
> ------------------------------------------------------------------
>
> Key: CALCITE-3536
> URL: https://issues.apache.org/jira/browse/CALCITE-3536
> Project: Calcite
> Issue Type: Bug
> Reporter: Jin Xing
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.22.0
>
> Time Spent: 3h 40m
> Remaining Estimate: 0h
>
> Currently, COALESCE expression specified in sql string will be rewrite to
> CASE by SqlValidator [1], thus CoalesceImplementor is almost no use. But it
> is actually used somewhere, for example Sum0Splitter. When running
> AggregateRemove and split expression SUM0, a COALESCE is actually created and
> no chance to be rewrite to CASE anymore.
> In current code, CoalesceImplementor doesn't handle NullAs properly by
> semantics.
> If we disable the rewrite from COALESCE to CASE in Validator and run below
> sql in JDBC Test:
> {code:java}
> select grocery_sqft from store where coalesce(grocery_sqft, 0) >= 20000{code}
> We will get below exception:
> {code:java}
> Caused by: java.lang.RuntimeException: Error while compiling generated Java
> code:
> public org.apache.calcite.linq4j.Enumerable bind(final
> org.apache.calcite.DataContext root) {
> final org.apache.calcite.linq4j.Enumerable _inputEnumerable =
> org.apache.calcite.schema.Schemas.queryable(root,
> root.getRootSchema().getSubSchema("foodmart2"), java.lang.Object[].class,
> "store").asEnumerable();
> return new org.apache.calcite.linq4j.AbstractEnumerable(){
> public org.apache.calcite.linq4j.Enumerator enumerator() {
> return new org.apache.calcite.linq4j.Enumerator(){
> public final org.apache.calcite.linq4j.Enumerator inputEnumerator
> = _inputEnumerable.enumerator();
> public void reset() {
> inputEnumerator.reset();
> } public boolean moveNext() {
> while (inputEnumerator.moveNext()) {
> final Integer inp16_ = (Integer) ((Object[])
> inputEnumerator.current())[16];
> if ((inp16_ ? inp16_.intValue() : 0) >= 20000) {
> return true;
> }
> }
> return false;
> } public void close() {
> inputEnumerator.close();
> } public Object current() {
> return (Integer) ((Object[]) inputEnumerator.current())[16];
> } };
> } };
> }
> at org.apache.calcite.avatica.Helper.wrap(Helper.java:37)
> at org.apache.calcite.avatica.Helper.wrap(Helper.java:37)
> at
> org.apache.calcite.adapter.enumerable.EnumerableInterpretable.toBindable(EnumerableInterpretable.java:128)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.implement(CalcitePrepareImpl.java:1111)
> at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:332)
> at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:231)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:638)
>
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:502)
>
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:472)
>
> at
> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:231)
>
> at
> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:550)
>
> at
> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675)
>
> at
> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)
> ... 29 more
> Caused by: org.codehaus.commons.compiler.CompileException: Line 14, Column
> 28: Not a boolean expression
> at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:12211)
> at org.codehaus.janino.UnitCompiler.compileBoolean2(UnitCompiler.java:3994)
> at org.codehaus.janino.UnitCompiler.access$6300(UnitCompiler.java:215){code}
> This issue was found when I try to resolve CALCITE-3124 and CALCITE-3505
> [1]
> [https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java#L1210]
--
This message was sent by Atlassian Jira
(v8.3.4#803005)