Rion Williams created FLINK-41067:
-------------------------------------

             Summary: Window and interval joins store rows whose join key can 
never match
                 Key: FLINK-41067
                 URL: https://issues.apache.org/jira/browse/FLINK-41067
             Project: Flink
          Issue Type: Improvement
          Components: Table SQL / Runtime
    Affects Versions: 2.3.0
            Reporter: Rion Williams


Like the regular streaming join before FLINK-41034, the window join and the 
interval join store every incoming row, including rows with a NULL in a join 
key field that isn't null-safe. Such rows can never match. The NULL check only 
runs when the join condition is evaluated:

* {{WindowJoinOperator}} (and {{AsyncStateWindowJoinOperator}}): 
{{WindowJoinHelper#processElement}} adds every accumulate row to the left or 
right window state. The check is in {{JoinConditionWithNullFilters}}.
* {{TimeIntervalJoin}} ({{RowTimeIntervalJoin}}, {{ProcTimeIntervalJoin}}): 
{{processElement1}}/{{processElement2}} add every row to the left or right 
cache. The check is in {{IntervalJoinFunction#join}}.

The state is keyed by the join key, so all NULL-key rows go to the same 
subtask. Unlike the regular join, this state is bounded: window state is 
cleared when the window fires, and the interval caches are cleaned when the 
interval expires. So the impact is a hot subtask and larger state for the 
duration of a window or interval, not state that grows without bound.

h3. Proposed change

Don't store a row whose join key can never match, using 
{{JoinConditionWithNullFilters#currentKeyCannotMatch}} from FLINK-41034 (and 
the same check in {{IntervalJoinFunction}}).

* Inner joins, and the non-preserved side of outer joins: drop the row.
* Preserved side of outer joins: today the null-padded row is emitted when the 
window fires, or when the interval expires. Emitting it immediately instead 
would avoid storing the row, but it changes when the row is emitted. This 
ticket should decide whether that is acceptable, in particular for the interval 
join's early-fire padding and for downstream operators that rely on window-end 
emission. The conservative option is to keep storing rows on the preserved side.

Both operators only receive append-only input (the window join rejects 
retractions), so there are no retractions of skipped rows to handle.



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

Reply via email to