prestodb/presto · error · UnsupportedOperationException

Unsupported type for 'year':

Error message

Unsupported type for 'year': 

What it means

PartitionTransforms.getColumnTransform implements the Iceberg year transform only for DATE, TIMESTAMP (and microsecond variants); any other type reaching the year case falls through to this NOT_SUPPORTED error, meaning a partition spec applies year() to an incompatible column type.

Source

Thrown at presto-iceberg/src/main/java/com/facebook/presto/iceberg/PartitionTransforms.java:107

                if (type.equals(TIMESTAMP)) {
                    LongUnaryOperator transformYear = value -> epochYear(value);
                    return new ColumnTransform(transform, INTEGER,
                            block -> transformBlock(TIMESTAMP, block, transformYear),
                            ValueTransform.from(TIMESTAMP, transformYear));
                }
                if (type.equals(TIMESTAMP_MICROSECONDS)) {
                    LongUnaryOperator transformYear = value -> epochYear(Math.floorDiv(value, 1000));
                    return new ColumnTransform(transform, INTEGER,
                            block -> transformBlock(TIMESTAMP_MICROSECONDS, block, transformYear),
                            ValueTransform.from(TIMESTAMP_MICROSECONDS, transformYear));
                }
                if (type.equals(TIMESTAMP_WITH_TIME_ZONE)) {
                    LongUnaryOperator transformYear = value -> epochYear(unpackMillisUtc(value));
                    return new ColumnTransform(transform, INTEGER,
                            block -> transformBlock(TIMESTAMP_WITH_TIME_ZONE, block, transformYear),
                            ValueTransform.from(TIMESTAMP_WITH_TIME_ZONE, transformYear));
                }
                throw new UnsupportedOperationException("Unsupported type for 'year': " + field);
            case "month":
                if (type.equals(DATE)) {
                    LongUnaryOperator transformMonth = value -> epochMonth(DAYS.toMillis(value));
                    return new ColumnTransform(transform, INTEGER,
                            block -> transformBlock(DATE, block, transformMonth),
                            ValueTransform.from(DATE, transformMonth));
                }
                if (type.equals(TIMESTAMP)) {
                    LongUnaryOperator transformMonth = value -> epochMonth(value);
                    return new ColumnTransform(transform, INTEGER,
                            block -> transformBlock(TIMESTAMP, block, transformMonth),
                            ValueTransform.from(TIMESTAMP, transformMonth));
                }
                if (type.equals(TIMESTAMP_MICROSECONDS)) {
                    LongUnaryOperator transformMonth = value -> epochMonth(Math.floorDiv(value, 1000));
                    return new ColumnTransform(transform, INTEGER,
                            block -> transformBlock(TIMESTAMP_MICROSECONDS, block, transformMonth),
                            ValueTransform.from(TIMESTAMP_MICROSECONDS, transformMonth));

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Change the partition transform so year() is only applied to date/timestamp columns
  2. Recreate the table's partition spec with a transform matching the column type
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at presto-iceberg/src/main/java/com/facebook/presto/iceberg/PartitionTransforms.java:107 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/249fb8748e8e054e. Report an issue: GitHub.