Mate Czagany created FLINK-40997:
------------------------------------

             Summary: Streaming join picks a random state key among 
equal-length upsert keys
                 Key: FLINK-40997
                 URL: https://issues.apache.org/jira/browse/FLINK-40997
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
            Reporter: Mate Czagany


The same SQL can produce different {{leftUpsertKeys}} / {{rightUpsertKeys}} 
order on {{StreamExecJoin}} nodes.

If the input has two or more upsert keys that tie for the fewest columns, and 
none of them is contained in that side's join key, otherwise 
{{JoinKeyContainsUniqueKey}} would be used.

Example:
{code:sql}
CREATE TABLE items (id INT, score INT, brand STRING, PRIMARY KEY (id) NOT 
ENFORCED) WITH (...);
CREATE TABLE z (k STRING, z STRING) WITH (...);

INSERT INTO snk
SELECT t.id, t.rn, z.z
FROM (SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY score DESC) AS rn 
FROM items)
      WHERE rn <= 3) t
JOIN z ON t.brand = z.k;
{code}
The left input of the join is {{{}(id, brand, rn){}}}. It has two upsert keys, 
{{id}} and {{{}rn{}}}, and the join key {{brand}} contains neither.

After compiling this several times, {{leftUpsertKeys}} of the join switches 
between [[0],[2]] (state keyed by {{{}id{}}}) and [[2],[0]] (keyed by 
{{{}rn{}}}). This can break state restore using a previous snapshot with a 
{{{}StateMigrationException{}}}.

With id {{BIGINT}} instead of {{{}INT{}}}, both keys are {{{}BIGINT NOT 
NULL{}}}, a state restore can succeed. Retractions then look up the wrong key, 
and stale rows stay in the join state and keep joining. No error is reported.



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

Reply via email to