Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Duplicate
-
1.20.0
Description
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(CAST((X/Y) AS 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)
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;
Attachments
Attachments
Issue Links
- duplicates
-
CALCITE-3224 New RexNode-to-Expression CodeGen Implementation
- Closed
- is duplicated by
-
CALCITE-3832 NPE when decimal cast double
- Closed
- is related to
-
CALCITE-3143 Dividing by NULLIF may cause "ArithmeticException: Division by zero"
- Closed
-
CALCITE-3832 NPE when decimal cast double
- Closed
- relates to
-
CALCITE-3150 NullPointerException when UPPER is repeated and combined with LIKE
- Closed
-
CALCITE-3173 RexNode Code Generation Problem
- Closed
- links to