{"record":{"id":"f8aa4a8dedce5870","repo":"apache/iceberg","slug":"unsupported-yearmonthintervaltype-f8aa4a","errorCode":null,"errorMessage":"Unsupported YearMonthIntervalType.","messagePattern":"Unsupported YearMonthIntervalType\\.","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java","lineNumber":43,"sourceCode":"import org.apache.flink.table.types.logical.NullType;\nimport org.apache.flink.table.types.logical.RawType;\nimport org.apache.flink.table.types.logical.StructuredType;\nimport org.apache.flink.table.types.logical.SymbolType;\nimport org.apache.flink.table.types.logical.YearMonthIntervalType;\nimport org.apache.flink.table.types.logical.ZonedTimestampType;\n\npublic abstract class FlinkTypeVisitor<T> implements LogicalTypeVisitor<T> {\n\n  // ------------------------- Unsupported types ------------------------------\n\n  @Override\n  public T visit(ZonedTimestampType zonedTimestampType) {\n    throw new UnsupportedOperationException(\"Unsupported ZonedTimestampType.\");\n  }\n\n  @Override\n  public T visit(YearMonthIntervalType yearMonthIntervalType) {\n    throw new UnsupportedOperationException(\"Unsupported YearMonthIntervalType.\");\n  }\n\n  @Override\n  public T visit(DayTimeIntervalType dayTimeIntervalType) {\n    throw new UnsupportedOperationException(\"Unsupported DayTimeIntervalType.\");\n  }\n\n  @Override\n  public T visit(DistinctType distinctType) {\n    throw new UnsupportedOperationException(\"Unsupported DistinctType.\");\n  }\n\n  @Override\n  public T visit(StructuredType structuredType) {\n    throw new UnsupportedOperationException(\"Unsupported StructuredType.\");\n  }\n\n  @Override","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java#L25-L61","documentation":"FlinkTypeVisitor's default visit(YearMonthIntervalType) throws UnsupportedOperationException because Flink's INTERVAL YEAR/MONTH types have no Iceberg counterpart. Encountering such a column in a type conversion aborts with this error.","triggerScenarios":"Flink-to-Iceberg conversion (FlinkSchemaUtil.toType/fromFlinkSchema) on a schema containing an INTERVAL YEAR, INTERVAL YEAR TO MONTH, or INTERVAL MONTH column.","commonSituations":"Schemas produced by date-diff computations typed as year-month intervals being written to an Iceberg sink; porting SQL from engines that map such intervals to storage types.","solutions":["Cast the interval column to a supported type, e.g. store as BIGINT months or STRING.","Compute the interval at read time from DATE/TIMESTAMP columns instead of persisting it.","Override visit(YearMonthIntervalType) in a custom visitor with an explicit mapping."],"exampleFix":"// before\nCREATE TABLE t (dur INTERVAL YEAR TO MONTH) -- iceberg sink\n// after\nCREATE TABLE t (dur_months BIGINT) -- CAST/duration_in_months","handlingStrategy":"validation","validationCode":"schema.getColumns().forEach(c -> {\n  if (c.getDataType().getLogicalType() instanceof YearMonthIntervalType) {\n    throw new IllegalArgumentException(\"Interval YEAR/MONTH not supported by Iceberg: \" + c.getName());\n  }\n});","typeGuard":"boolean isYearMonthInterval(LogicalType t) { return t instanceof YearMonthIntervalType; }","tryCatchPattern":"try {\n  RowType rowType = FlinkSchemaUtil.toType(rowDataType);\n} catch (UnsupportedOperationException e) {\n  // find interval columns and recast to BIGINT/STRING\n}","preventionTips":["Never persist year-month interval columns; store months as BIGINT.","Compute intervals at query time from DATE/TIMESTAMP columns.","Validate upstream connector schemas for interval types."],"tags":["flink","type-conversion","unsupported-type","interval"],"backgroundTag":"unsupported-dtype","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"}