Yanquan Lv created FLINK-41057:
----------------------------------

             Summary: 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


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.
h2. 
RELATED ISSUE

FLINK-40640



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

Reply via email to