{"record":{"id":"50b5ac444acf0906","repo":"apache/iceberg","slug":"could-not-set-a-field-in-the-rowdatawrapper-becaus-50b5ac","errorCode":null,"errorMessage":"Could not set a field in the RowDataWrapper because rowData is read-only","messagePattern":"Could not set a field in the RowDataWrapper because rowData is read-only","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/RowDataWrapper.java","lineNumber":83,"sourceCode":"  }\n\n  @Override\n  public int size() {\n    return types.length;\n  }\n\n  @Override\n  public <T> T get(int pos, Class<T> javaClass) {\n    if (rowData.isNullAt(pos)) {\n      return null;\n    }\n\n    return javaClass.cast(getters[pos].get(rowData, pos));\n  }\n\n  @Override\n  public <T> void set(int pos, T value) {\n    throw new UnsupportedOperationException(\n        \"Could not set a field in the RowDataWrapper because rowData is read-only\");\n  }\n\n  private interface PositionalGetter<T> {\n    T get(RowData data, int pos);\n  }\n\n  private static PositionalGetter<?> buildGetter(LogicalType logicalType, Type type) {\n    switch (logicalType.getTypeRoot()) {\n      case TINYINT:\n        return (row, pos) -> (int) row.getByte(pos);\n      case SMALLINT:\n        return (row, pos) -> (int) row.getShort(pos);\n      case CHAR:\n      case VARCHAR:\n        return (row, pos) -> row.getString(pos).toString();\n\n      case BINARY:","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/RowDataWrapper.java#L65-L101","documentation":"RowDataWrapper adapts Flink RowData to Iceberg's StructLike for reading. Because RowData instances are read-only views over source data, set() is intentionally unsupported and always throws UnsupportedOperationException.","triggerScenarios":"Calling .set(pos, value) on a RowDataWrapper obtained from wrapping a RowData record, e.g. code that assumes StructLike mutability (some Iceberg internal paths only read).","commonSituations":"Custom code reusing Iceberg StructLike wrappers to build or mutate records; accidentally passing a RowData-backed wrapper where an Iceberg Record/UpdatableRecord is expected by writer APIs.","solutions":["Use a mutable Iceberg Record (GenericRecord) or the writer-specific record class instead of RowDataWrapper for constructing data","Only use RowDataWrapper in read paths (get); never call set","Build a RowData via GenericRowData if you need to construct Flink-side records"],"exampleFix":"// before\nRowDataWrapper w = ...; w.set(0, 42); // throws\n// after\nGenericRowData row = new GenericRowData(numFields); row.setField(0, 42);","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"boolean isReadOnly(StructLike s) {\n  return s instanceof RowDataWrapper;\n}\n// only call set() on mutable records (e.g. GenericRecord)","tryCatchPattern":"if (wrapper instanceof RowDataWrapper) {\n  throw new IllegalStateException(\"RowDataWrapper is read-only; use GenericRecord for writes\");\n}\nwrapper.set(pos, value);","preventionTips":["Treat RowDataWrapper strictly as a read adapter","Use GenericRecord/GenericRowData for constructing or mutating records","Never hand RowData-backed wrappers to write-path APIs expecting mutable StructLike"],"tags":["flink","read-only","rowdata"],"backgroundTag":"unsupported-operation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}