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

ASF GitHub Bot updated FLINK-41057:
-----------------------------------
    Labels: pull-request-available  (was: )

> Iceberg append-only tables incorrectly append before-images from UPDATE and 
> DELETE events
> -----------------------------------------------------------------------------------------
>
>                 Key: FLINK-41057
>                 URL: https://issues.apache.org/jira/browse/FLINK-41057
>             Project: Flink
>          Issue Type: Bug
>          Components: Flink CDC
>    Affects Versions: cdc-3.7.0
>            Reporter: Yanquan Lv
>            Assignee: Yanquan Lv
>            Priority: Critical
>              Labels: pull-request-available
>
> h2. BACKGROUND
> The Iceberg sink must handle CDC events according to the target table's write 
> capabilities.
> For tables with identifier fields, UPDATE events require deleting the 
> before-image and inserting the after-image. For append-only tables without 
> identifier fields, UPDATE events should only append the after-image, and 
> DELETE events should be ignored.
> The fix for FLINK-40640 introduced unconditional conversion of UPDATE events 
> into DELETE(before) followed by INSERT(after), without distinguishing these 
> two types of target tables.
> h2. PROBLEM
> Append-only writers do not apply deletion semantics to rows marked as DELETE. 
> Instead, they append those rows as ordinary records.
> As a result:
>  - UPDATE events append both the before-image and the after-image, 
> introducing an extra copy of the old record.
>  - DELETE events append the deleted record instead of leaving the target 
> table unchanged.
> The UPDATE behavior is a regression introduced by the unconditional UPDATE 
> splitting. The DELETE behavior is a pre-existing issue.
> h2. REPRODUCTION SCENARIO
> Use an Iceberg target table without identifier fields.
> 1. Insert a record: (1, "old").
> 2. Update the record from (1, "old") to (1, "new").
> 3. Commit the changes.
> Actual table contents:
>  - (1, "old")
>  - (1, "old")
>  - (1, "new")
> Expected table contents:
>  - (1, "old")
>  - (1, "new")
> If a subsequent DELETE event for (1, "new") is received, the table contents 
> should remain unchanged. No additional record should be appended.
> h2. EXPECTED BEHAVIOR
> For append-only target tables:
>  - INSERT and REPLACE: append the after-image.
>  - UPDATE: append only the after-image.
>  - DELETE: ignore the event.
> For target tables with identifier fields:
>  - Preserve existing equality-delete behavior.
>  - Keep partition-changing UPDATE events working correctly.
> Determine the write capability from the actual target Iceberg table's 
> identifier fields, rather than solely from primary keys declared in the 
> incoming CDC schema.
> Retaining historical records in an append-only table is intentional. This 
> issue does not introduce upsert or delete support for such tables.
> h2. ACCEPTANCE CRITERIA
>  - Cover partitioned and unpartitioned append-only tables.
>  - Cover mixed target-table capabilities within the same writer.
>  - Cover mismatches between incoming CDC primary keys and target-table 
> identifier fields.
>  - Preserve correct UPDATE and DELETE behavior for tables with identifier 
> fields.
>  - Correctly invalidate cached writer factories on schema changes, including 
> when an ignored DELETE has not created a task writer.



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

Reply via email to