sepuri sai krishna created FLINK-40338:
------------------------------------------

             Summary: ELT() throws ClassCastException when the index argument 
is not INT
                 Key: FLINK-40338
                 URL: https://issues.apache.org/jira/browse/FLINK-40338
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Runtime
    Affects Versions: 2.3.0, 2.2.0, 2.1.0, 2.0.0
            Reporter: sepuri sai krishna


{{ELT}} accepts any {{INTEGER_NUMERIC}} index. {{IndexArgumentTypeStrategy}} 
returns the argument's own data type unchanged (no implicit cast to {{INT}}), 
and the documentation lists the supported signatures as:

{noformat}
index <TINYINT | SMALLINT | INTEGER | BIGINT>, expr <CHAR | VARCHAR>, exprs 
<CHAR | VARCHAR>
index <TINYINT | SMALLINT | INTEGER | BIGINT>, expr <BINARY | VARBINARY>, exprs 
<BINARY | VARBINARY>
{noformat}

But {{EltFunction#eval}} indexes the varargs array with {{exprs[(int) index - 
1]}}, where {{index}} is declared as {{java.lang.Number}}. Per JLS 5.5, casting 
a {{Number}} reference to {{int}} compiles to a narrowing reference conversion 
to {{Integer}} followed by unboxing, i.e. {{((Integer) index).intValue()}}. The 
call therefore succeeds only when the boxed value is exactly an {{Integer}}; a 
{{Byte}}, {{Short}} or {{Long}} fails the {{checkcast}}.

h3. Reproducer

{code:sql}
SELECT ELT(CAST(2 AS BIGINT), 'scala', 'java');
{code}

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

Same for {{CAST(2 AS TINYINT)}} and {{CAST(2 AS SMALLINT)}}.

h3. Why this was not caught

The out-of-range guard above the cast uses {{index.longValue()}}, so 
out-of-range indices of any type still return {{NULL}} correctly. The exception 
only fires on the success path, when {{1 <= index <= number of expressions}}. 
That is why the existing test {{ELT(9223372036854775807, 'ab', 'b')}} passes -- 
it returns {{NULL}} before ever reaching the cast. Every other existing test 
uses an {{INT}} literal.

h3. Fix

Narrow the already-unboxed {{long idx}} rather than casting the {{Number}} 
reference.

Present since FLINK-35987 introduced ELT; confirmed absent from release-1.20 
and present from release-2.0.




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

Reply via email to