Rion Williams created FLINK-41068:
-------------------------------------

             Summary: LATERAL SNAPSHOT join stores build-side rows whose join 
key can never match
                 Key: FLINK-41068
                 URL: https://issues.apache.org/jira/browse/FLINK-41068
             Project: Flink
          Issue Type: Improvement
          Components: Table SQL / Runtime
    Affects Versions: 2.3.0
            Reporter: Rion Williams


{{LateralSnapshotJoinOperator}} materializes the whole build side. 
{{processElement2}} buffers every build-side change in {{buildChangeBuffer}}, 
and {{applyBuildChanges}} then adds it to {{buildTableState}}, a multiset that 
is only bounded by the state TTL. That includes rows with a NULL in a join key 
field that isn't null-safe. Such rows can never match: the NULL check only runs 
in {{JoinConditionWithNullFilters}} when a probe row is joined.

The state is keyed by the join key, so all NULL-key build rows end up in the 
state of the same subtask and stay there for as long as the build-side table 
contains them.

h3. Proposed change

The build side is never preserved, so no output depends on build rows whose key 
can never match. {{processElement2}} can skip an INSERT or UPDATE_AFTER build 
change when {{JoinConditionWithNullFilters#currentKeyCannotMatch}} (from 
FLINK-41034) is true, before it is buffered.

Retractions need care:
* Rows stored by an earlier version must still be removed, so retractions of 
NULL-key rows should still be applied. Removing a row that was never stored is 
a no-op.
* But {{applyBuildChanges}} counts a retraction of a row that isn't stored in 
{{numUnmatchedBuildRetractions}}. Retractions of rows whose key can never match 
should not be counted, or the metric would report every NULL-key delete.

Optionally, probe rows whose key can never match don't need to be buffered 
during the LOAD phase for an inner join. For a left outer join, the null-padded 
row still has to be emitted in order with the other buffered probe rows of the 
same key.



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

Reply via email to