apache/iceberg · error · UnsupportedOperationException

errMsg(variant, "int")

Error message

errMsg(variant, "int")

What it means

VariantRowDataWrapper.intValue converts a Variant value to a Flink int, but only supports TINYINT, SMALLINT, and INT variant types. If the Variant holds any other physical type (e.g. BIGINT, STRING, DOUBLE), the wrapper throws UnsupportedOperationException with errMsg(variant, "int") naming the actual type. It guards the type-narrowing read path of the RowData wrapper against silent data corruption.

Source

Thrown at flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/data/VariantRowDataWrapper.java:255

    }

    int arraySize = BinaryVariantAccessorUtils.arraySize(variant);
    Object[] elements = new Object[arraySize];

    for (int i = 0; i < arraySize; i++) {
      Variant element = variant.getElement(i);
      elements[i] = elementValue(element, innerElementType);
    }

    return new GenericArrayData(elements);
  }

  private static int intValue(Variant variant) {
    return switch (variant.getType()) {
      case TINYINT -> variant.getByte();
      case SMALLINT -> variant.getShort();
      case INT -> variant.getInt();
      default -> throw new UnsupportedOperationException(errMsg(variant, "int"));
    };
  }

  private static long longValue(Variant variant) {
    return switch (variant.getType()) {
      case TINYINT -> variant.getByte();
      case SMALLINT -> variant.getShort();
      case INT -> variant.getInt();
      case BIGINT -> variant.getLong();
      default -> throw new UnsupportedOperationException(errMsg(variant, "long"));
    };
  }

  private static double doubleValue(Variant variant) {
    return switch (variant.getType()) {
      case FLOAT -> variant.getFloat();
      case DOUBLE -> variant.getDouble();
      default -> throw new UnsupportedOperationException(errMsg(variant, "double"));

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Check the variant's actual stored type and read it with a matching Flink logical type (BIGINT -> getLong, etc.).
  2. Fix the schema/type mapping so the Flink field type matches the variant's declared physical type.
  3. If casting is intended, convert the variant value (e.g. via variant type switch or SQL CAST) before wrapping.

Example fix

// before
int v = wrapper.getInt(variantPos);
// after
if (variant.getType() == Variant.Type.BIGINT) {
  long v = wrapper.getLong(variantPos);
}
Defensive patterns

Strategy: type-guard

Validate before calling

if (variant.getType() == Variant.Type.TINYINT || variant.getType() == Variant.Type.SMALLINT || variant.getType() == Variant.Type.INT) { /* safe to getInt */ }

Type guard

boolean isIntVariant(Variant v) { return switch (v.getType()) { case TINYINT, SMALLINT, INT -> true; default -> false; }; }

Try / catch

try { int v = wrapper.getInt(pos); } catch (UnsupportedOperationException e) { /* fallback: read via matching accessor or log type mismatch */ }

Prevention

When it happens

Trigger: Calling RowDataWrapper.getInt(pos) (directly or via elementValue for array/map elements) when the underlying Variant at that position has getType() other than TINYINT, SMALLINT, or INT — e.g. reading a BIGINT or string variant through an INTEGER-typed Flink field.

Common situations: Schema drift between the declared Flink/iceberg type and actual variant contents; reading variant columns with a wrong Flink physical type mapping; unit tests feeding an arbitrary variant into an INT-typed wrapper.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/abc1a6b2cbc5cd76. Report an issue: GitHub.