*This is the optimized generated code*
final Object[] current = (Object[]) inputEnumerator.current();
final Integer inp0_ = (Integer) current[0];
final Integer inp1_ = (Integer) current[1];
final java.math.BigDecimal v1 = new java.math.BigDecimal(
  inp0_.intValue() / inp1_.intValue()); *// NPE*
return inp0_ == null || inp1_ == null ? (java.math.BigDecimal) null :
org.apache.calcite.runtime.SqlFunctions.sround(v1, 2);

*This is the non-optimized one*
final Object[] current = (Object[]) inputEnumerator.current();
final Integer inp0_ = (Integer) current[0];
final boolean inp0__unboxed = inp0_ == null;
final Integer inp1_ = (Integer) current[1];
final boolean inp1__unboxed = inp1_ == null;
final boolean v = inp0__unboxed || inp1__unboxed;
final int inp0__unboxed0 = inp0_.intValue(); *// NPE*
final int inp1__unboxed0 = inp1_.intValue(); *// NPE*
final int v0 = inp0__unboxed0 / inp1__unboxed0;
final java.math.BigDecimal v1 = new java.math.BigDecimal(
  v0);
final java.math.BigDecimal v2 = v ? (java.math.BigDecimal) null :
org.apache.calcite.runtime.SqlFunctions.sround(v1, 2);
return v2;

I'm still trying to understand how to fix this. I assume I need to avoid
creating an Expression for "final int inp0__unboxed0 = inp0_.intValue()"
and "final int inp1__unboxed0 = inp1_.intValue()". Any hints ?

Thanks,
Gelbana


On Sun, Jun 16, 2019 at 9:28 PM Muhammad Gelbana <[email protected]>
wrote:

> Of course, my bad!
>
> -- Regular cast syntax
> SELECT ROUND(CAST((X/Y) AS NUMERIC), 2) FROM (VALUES (1, 2), (NULLIF(5,
> 5), NULLIF(5, 5))) A(X, Y)
>
> Thanks,
> Gelbana
>
>
> On Sun, Jun 16, 2019 at 8:43 PM Julian Hyde <[email protected]>
> wrote:
>
>> Can you reproduce it with regular cast syntax? Make it as easy as
>> possible for others to help you.
>>
>> Julian
>>
>> > On Jun 16, 2019, at 11:24 AM, Muhammad Gelbana <[email protected]>
>> wrote:
>> >
>> > The following query throws a NPE in the generated code because it
>> assumes
>> > the divided value to be an initialized Java object (Not null), which is
>> > fine for the first row, but not for the second.
>> >
>> > SELECT ROUND((X/Y)::NUMERIC, 2)
>> > FROM (VALUES (1, 2), (NULLIF(5, 5), NULLIF(5, 5))) A(X, Y)
>> >
>> > If I modify the query a little bit, it runs ok:
>> > -- No casting
>> > SELECT ROUND((X/Y), 2) FROM (VALUES (1, 2), (NULLIF(5, 5), NULLIF(5,
>> 5)))
>> > A(X, Y)
>> >
>> > -- No rounding
>> > SELECT (X/Y)::NUMERIC FROM (VALUES (1, 2), (NULLIF(5, 5), NULLIF(5, 5)))
>> > A(X, Y)
>> >
>> > What could be causing this ? Any hints ?
>> > And was this reported before or should I create a new ticket ?
>> >
>> > Thanks,
>> > Gelbana
>>
>

Reply via email to