{"record":{"id":"3c504facb42a6541","repo":"apache/iceberg","slug":"unsupported-zonedtimestamptype-3c504f","errorCode":null,"errorMessage":"Unsupported ZonedTimestampType.","messagePattern":"Unsupported ZonedTimestampType\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java","lineNumber":38,"sourceCode":"\nimport org.apache.flink.table.types.logical.DayTimeIntervalType;\nimport org.apache.flink.table.types.logical.DistinctType;\nimport org.apache.flink.table.types.logical.LogicalType;\nimport org.apache.flink.table.types.logical.LogicalTypeVisitor;\nimport 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","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java#L20-L56","documentation":"The default FlinkTypeVisitor.visit(ZonedTimestampType) throws UnsupportedOperationException because Iceberg has no mapping for Flink's TIMESTAMP_WITH_LOCAL_TIME_ZONE zoned timestamp type. Any visitor-based Flink-to-Iceberg type conversion (e.g. FlinkTypeUtil.toIcebergType / schema conversion) hits this when the Flink type tree contains a zoned timestamp.","triggerScenarios":"Converting a Flink schema containing a TIMESTAMP(3) WITH LOCAL TIME ZONE column to an Iceberg type via FlinkTypeVisitor; calling FlinkSchemaUtil/FlinkTypeToType on such a column.","commonSituations":"DDLs using `TIMESTAMP_LTZ` or `TIMESTAMP WITH LOCAL TIME ZONE` columns (common for event-time ingestion from Kafka/Debezium) mapped to Iceberg tables.","solutions":["Change the column type to plain `TIMESTAMP(6)` (without local time zone) in the Flink DDL.","Cast the LTZ column to TIMESTAMP in the pipeline before writing to Iceberg.","Use a custom LogicalTypeVisitor subclass that overrides visit(ZonedTimestampType) with a project-specific mapping (e.g. TimestamptzType) if your Iceberg/Flink versions support it."],"exampleFix":"// before\nCREATE TABLE t (event_ts TIMESTAMP(3) WITH LOCAL TIME ZONE);\n// after\nCREATE TABLE t (event_ts TIMESTAMP(6));","handlingStrategy":"type-guard","validationCode":"if (dataType.getLogicalType() instanceof ZonedTimestampType) {\n  throw new IllegalArgumentException(\"Use TIMESTAMP(6) instead of TIMESTAMP WITH LOCAL TIME ZONE for Iceberg\");\n}","typeGuard":"boolean isUnsupported = t instanceof ZonedTimestampType || t instanceof YearMonthIntervalType || t instanceof DayTimeIntervalType || t instanceof DistinctType || t instanceof StructuredType || t instanceof NullType || t instanceof RawType<?> || t instanceof SymbolType<?>;","tryCatchPattern":"try {\n  icebergType = FlinkTypeUtil.toIcebergType(dataType);\n} catch (UnsupportedOperationException e) {\n  // fall back to a supported type or surface a clear migration message\n}","preventionTips":["Use TIMESTAMP(6) instead of TIMESTAMP_LTZ in Iceberg-bound DDLs.","Screen source schemas for LTZ columns during pipeline design."],"tags":["flink","type-mapping","timestamp"],"backgroundTag":"incompatible-source-type","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"}