prestodb/presto · error · UnsupportedOperationException

Iceberg column type ${fieldType.typeId()} is not supported

Error message

Iceberg column type ${fieldType.typeId()} is not supported

What it means

ColumnIdentity.createColumnIdentity maps Iceberg primitive field types to Presto column identities; when the field's typeId is one the connector does not recognize/translate, this NOT_SUPPORTED guard fires, meaning the table's schema contains an Iceberg type unsupported by this Presto version.

Source

Thrown at presto-iceberg/src/main/java/com/facebook/presto/iceberg/ColumnIdentity.java:185

            return new ColumnIdentity(id, name, ARRAY, ImmutableList.of(elementColumn), typeAttributes);
        }

        if (fieldType.isStructType()) {
            List<ColumnIdentity> fieldColumns = fieldType.asStructType().fields().stream()
                    .map(ColumnIdentity::createColumnIdentity)
                    .collect(toImmutableList());
            return new ColumnIdentity(id, name, STRUCT, fieldColumns, typeAttributes);
        }

        if (fieldType.isMapType()) {
            List<ColumnIdentity> keyValueColumns = fieldType.asMapType().fields().stream()
                    .map(ColumnIdentity::createColumnIdentity)
                    .collect(toImmutableList());
            checkArgument(keyValueColumns.size() == 2, "Expected map type to have two fields");
            return new ColumnIdentity(id, name, MAP, keyValueColumns, typeAttributes);
        }

        throw new UnsupportedOperationException(format("Iceberg column type %s is not supported", fieldType.typeId()));
    }

    // Derives the Iceberg V3 type-disambiguation attributes (ORC Appendix A
    // semantics) that the format-erased Presto type cannot represent. Returns
    // Optional.empty() when nothing is set, so the attribute is omitted from the
    // serialized handle and column identities are unchanged for the common
    // case.
    //
    // Only UUID and FIXED are derived today: both Iceberg types map to Presto
    // VARBINARY, so the binary variant and (for FIXED) the length are
    // genuinely lost without these attributes. Iceberg LONG already maps 1:1
    // to Presto BIGINT (and INT to INTEGER), so a `long-type` attribute would
    // be redundant; timestamp unit is always microseconds in the current
    // Iceberg spec; and `iceberg.required` (nullability) is carried by the ORC
    // writer path. Those fields remain on IcebergTypeAttributes so the wire
    // format and the native worker are ready for them, but deriving them here
    // is deferred to avoid rewriting every column identity.
    private static Optional<IcebergTypeAttributes> deriveTypeAttributes(org.apache.iceberg.types.Type fieldType)

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Identify the offending column type from the Iceberg schema and change it to a supported type
  2. Upgrade Presto to a version supporting the newer Iceberg type (e.g. variant/nanosecond timestamps)
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at presto-iceberg/src/main/java/com/facebook/presto/iceberg/ColumnIdentity.java:185 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/8f345f2ffcc7c519. Report an issue: GitHub.