Jerome Isaac Haltom created CALCITE-7801:
--------------------------------------------

             Summary: JSON_VALUE(..., RETURNING DOUBLE) throws 
ClassCastException when the JSON number is an integer
                 Key: CALCITE-7801
                 URL: https://issues.apache.org/jira/browse/CALCITE-7801
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.42.0, 1.41.0
            Reporter: Jerome Isaac Haltom


{{JSON_VALUE}} with a {{RETURNING}} type throws unless the value's Java class 
already is that type.

{code:sql}
SELECT JSON_VALUE('{"c":0}', '$.c' RETURNING DOUBLE)
{code}

{noformat}
java.lang.ClassCastException: java.lang.Integer cannot be cast to 
java.lang.Double
{noformat}

The same query works if the number is written with a decimal point:

{code:sql}
SELECT JSON_VALUE('{"c":-83.489548}', '$.c' RETURNING DOUBLE)   -- -83.489548
{code}

So it depends on the value, not on the query. Over a table it fails on some 
rows and not others:

{code:sql}
SELECT JSON_VALUE(v, '$.c' RETURNING DOUBLE) AS c
FROM (VALUES ('{"c":-83.489548}'), ('{"c":0}')) AS t(v)
{code}

{{RETURNING INTEGER}} fails the same way on a number that has a decimal point:

{code:sql}
SELECT JSON_VALUE('{"c":0.5}', '$.c' RETURNING INTEGER)
-- java.lang.ClassCastException: java.lang.Double cannot be cast to 
java.lang.Integer
{code}

{{ON ERROR}} does not catch it. {{NULL ON ERROR}} throws too:

{code:sql}
SELECT JSON_VALUE('{"c":0}', '$.c' RETURNING DOUBLE NULL ON ERROR)
{code}

A {{CAST}} works:

{code:sql}
SELECT CAST(JSON_VALUE('{"c":0}', '$.c') AS DOUBLE)   -- 0.0
{code}

Expected: {{RETURNING DOUBLE}} should convert the value the way a {{CAST}} 
does, and a value it cannot convert should be an error the {{ON ERROR}} clause 
handles.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to