[ 
https://issues.apache.org/jira/browse/FLINK-31653?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Yuan Kui updated FLINK-31653:
-----------------------------
    Description: 
When I use the `if` statement for the string subtype of the row type, the code 
generated by `IfCallGen` may meet npe. The case is:
{code:java}
-- if the value of 'nested' colmun is row(null, 10), the job will meet npe
CREATE TABLE NestedTable (
  nested row<name string, `value` int>
) WITH (
  ...
);

select
    if (nested.name is null, 'JKL', nested.name) AS nestedName
from NestedTable {code}
Three conditions are required to reproduce the bug:

1、use `if` statement

2、string subtype of row type

3、the value of string subtype element is null

 

After excluding the effect of java code spilitter, the picture shows the 
original code generated by codegen(you can find the complete code generated by 
codegen in attached file: [^StreamExecCalc$17]),the assignment logic for 
`isNull$7` is between the line 140 and the line 152, so the value of `isNull$7` 
in line 94 is always false(the default value), and the line 96 will meet npe 
when `result$7` is null.

!image-2023-03-29-16-06-19-351.png|width=703,height=533!

To fix this issue, wen can change the location of generating casted codes in 
`IfCallGen`, like this:

!image-2023-03-29-15-33-37-983.png|width=829,height=361!

  was:
When I use the `if` statement for the string subtype of the row type, the code 
generated by `IfCallGen` may meet npe. The case is:
{code:java}
-- if the value of 'nested' colmun is row(null, 10), the job will meet npe
CREATE TABLE NestedTable (
  nested row<name string, `value` int>
) WITH (
  ...
);

select
    if (nested.name is null, 'JKL', nested.name) AS nestedName
from NestedTable {code}
Three conditions are required to reproduce the bug:

1、use `if` statement

2、string subtype of row type

3、the value of string subtype element is null

 

After excluding the effect of java code spilitter, the picture shows the 
original code generated by codegen(you can find the complete code generated by 
codegen in attached file: [^StreamExecCalc$17]),the assignment logic for 
`isNull$7` is between the line 140 and the line 152, so the value of `isNull$7` 
in line 94 is always false(the default value), and the line 96 will meet npe 
when `result$7` is null.

!image-2023-03-29-16-06-19-351.png|width=703,height=533!

To fix this issue, wen can change the location of casted codes in `IfCallGen`, 
like this:

!image-2023-03-29-15-33-37-983.png|width=829,height=361!


> Using`if` statement for a string subtype of the row type may meet npe in code 
> generated by codegen
> --------------------------------------------------------------------------------------------------
>
>                 Key: FLINK-31653
>                 URL: https://issues.apache.org/jira/browse/FLINK-31653
>             Project: Flink
>          Issue Type: Bug
>          Components: Table SQL / Planner
>    Affects Versions: 1.16.1, 1.15.4, 1.18.0, 1.17.1
>            Reporter: Yuan Kui
>            Assignee: Yuan Kui
>            Priority: Critical
>             Fix For: 1.16.2, 1.18.0, 1.17.1, 1.15.5
>
>         Attachments: StreamExecCalc$17, image-2023-03-29-15-33-37-983.png, 
> image-2023-03-29-16-06-19-351.png
>
>
> When I use the `if` statement for the string subtype of the row type, the 
> code generated by `IfCallGen` may meet npe. The case is:
> {code:java}
> -- if the value of 'nested' colmun is row(null, 10), the job will meet npe
> CREATE TABLE NestedTable (
>   nested row<name string, `value` int>
> ) WITH (
>   ...
> );
> select
>     if (nested.name is null, 'JKL', nested.name) AS nestedName
> from NestedTable {code}
> Three conditions are required to reproduce the bug:
> 1、use `if` statement
> 2、string subtype of row type
> 3、the value of string subtype element is null
>  
> After excluding the effect of java code spilitter, the picture shows the 
> original code generated by codegen(you can find the complete code generated 
> by codegen in attached file: [^StreamExecCalc$17]),the assignment logic for 
> `isNull$7` is between the line 140 and the line 152, so the value of 
> `isNull$7` in line 94 is always false(the default value), and the line 96 
> will meet npe when `result$7` is null.
> !image-2023-03-29-16-06-19-351.png|width=703,height=533!
> To fix this issue, wen can change the location of generating casted codes in 
> `IfCallGen`, like this:
> !image-2023-03-29-15-33-37-983.png|width=829,height=361!



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

Reply via email to