{"record":{"id":"753e132001b1838a","repo":"apache/iceberg","slug":"unsupported-zonedtimestamptype","errorCode":null,"errorMessage":"Unsupported ZonedTimestampType.","messagePattern":"Unsupported ZonedTimestampType\\.","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v1.20/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/v1.20/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java#L20-L56","documentation":"FlinkTypeVisitor deliberately rejects Flink SQL types that have no Iceberg mapping. A ZonedTimestampType (TIMESTAMP WITH LOCAL TIME ZONE) cannot be represented losslessly in Iceberg's timestamp types, so the visitor throws UnsupportedOperationException. This fires whenever any Flink-to-Iceberg type conversion encounters a zoned timestamp in the schema.","triggerScenarios":"Creating an Iceberg table from a Flink schema that contains TIMESTAMP(3) WITH LOCAL TIME ZONE columns; pushing a Flink DataStream/RowType with zoned timestamps through FlinkSchemaUtil/FlinkTypeUtil conversion.","commonSituations":"Using Flink's TIMESTAMP_LTZ type in a CREATE TABLE backed by Iceberg; reading CDC sources (e.g. Debezium) that produce TIMESTAMP_WITH_LOCAL_TIME_ZONE and trying to sink to Iceberg.","solutions":["Change the column to TIMESTAMP (without time zone) — store UTC-normalized values instead.","If you need zoned semantics, convert values to UTC and keep a separate zone column, or use ToTimestamp/UDF conversions before writing.","Check your Iceberg/Flink version — some later versions added limited support or clearer mapping guidance for TIMESTAMP_LTZ."],"exampleFix":"// before\nevent_time TIMESTAMP(3) WITH LOCAL TIME ZONE\n// after\nevent_time TIMESTAMP(3)  -- convert to UTC before writing","handlingStrategy":"type-guard","validationCode":"for (RelDataTypeField f : rowType.getFieldList()) {\n  if (f.getType().getSqlTypeName() == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE) {\n    throw new IllegalArgumentException(\"TIMESTAMP WITH LOCAL TIME ZONE not supported by Iceberg: \" + f.getName());\n  }\n}","typeGuard":"static boolean isIcebergCompatible(LogicalType t) {\n  return !(t instanceof ZonedTimestampType) && !(t instanceof YearMonthIntervalType);\n}","tryCatchPattern":"try {\n  convertFlinkTypeToIceberg(type);\n} catch (UnsupportedOperationException e) {\n  LOG.error(\"Unsupported Flink type for Iceberg: {}\", e.getMessage());\n  throw e;\n}","preventionTips":["Avoid TIMESTAMP_LTZ / ZonedTimestampType columns in Iceberg-backed Flink tables.","Normalize timestamps to UTC and use plain TIMESTAMP types.","Check the Flink TypeInformation/RowType before building sinks or CREATE TABLE DDL for Iceberg."],"tags":["flink","schema","type-mapping"],"backgroundTag":"unsupported-dtype","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}