Weiqing Yang created FLINK-40120:
------------------------------------

             Summary: Persist RowData field names in RowDataSerializerSnapshot
                 Key: FLINK-40120
                 URL: https://issues.apache.org/jira/browse/FLINK-40120
             Project: Flink
          Issue Type: Improvement
          Components: Table SQL / Runtime
            Reporter: Weiqing Yang


{\{RowDataSerializerSnapshot}} currently persists only the field *types* of a 
\{{RowData}} state serializer, not the field *names*. Multiple efforts need the 
names persisted:

- FLIP-599 (State Catalog) needs the field names to infer and expose a readable 
schema for keyed state.
- FLIP-527 (State Schema Evolution for RowData) needs them for name-based 
compatibility and migration.

This issue covers the small, self-contained, shared building block: *persist 
the RowData field names in the serializer snapshot, written unconditionally and 
decoupled from any schema-evolution enable/disable logic.*

*Scope (in):*
- Add \{{String[] fieldNames}} to \{{RowDataSerializer}} (name-based metadata; 
a lightweight alternative to carrying the full \{{RowType}}).
- Bump \{{RowDataSerializerSnapshot}} from V3 to V4, appending the field names 
after the existing field-types section. Names are written *unconditionally* 
(not gated on any feature flag).
- V4 readers remain able to read V3 snapshots (field names absent -> null), so 
existing savepoints continue to restore.
- Field names cover nested ROW types recursively.

*Scope (out - intentionally not here):*
- No change to \{{resolveSchemaCompatibility}} behavior: with only this change, 
a field-type-array difference stays \{{incompatible()}} exactly as today. This 
issue adds no migration/evolution behavior; it only makes the names available.
- The schema-evolution opt-in and the compatibility/migration logic that 
consumes the names are owned by FLIP-527 and are out of scope here. Decoupling 
the "names persisted" metadata from the "evolution permitted" signal is 
precisely why this is a standalone change.
- Scoped to \{{RowDataSerializer}}, since its snapshot is the one that persists 
field types without names. Field names for other serializer types, if the State 
Catalog needs them, are separate follow-ups (each serializer owns its own 
snapshot format).

*Compatibility:*
- Backward compatible. Snapshot format moves V3 -> V4 by appending names; V4 
reads V3 with names absent. Runtime behavior is unchanged for all existing jobs 
(names are persisted but not yet consumed by any decision).

Both FLIP-527 and FLIP-599 independently proposed the same V3 -> V4 
name-storage bump; landing it once as shared infrastructure lets whichever FLIP 
lands first establish a single format that serves both, and avoids two 
conflicting snapshot bumps. Discussed on the FLIP-599 [DISCUSS] thread.

Links:
- FLIP-599: State Catalog - 
https://lists.apache.org/thread/xhojhcr0pkg7j8dblnt2crrdkkjz76vo
- FLIP-527: State Schema Evolution for RowData - 
https://cwiki.apache.org/confluence/spaces/FLINK/pages/353601981/FLIP-527+State+Schema+Evolution+for+RowData



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

Reply via email to