{"record":{"id":"26d243d1ffd2ccd2","repo":"apache/iceberg","slug":"failed-to-read-variant-s-of-type-s-as-int","errorCode":null,"errorMessage":"Failed to read Variant %s of type %s as int","messagePattern":"Failed to read Variant (.+?) of type (.+?) as int","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/data/VariantRowDataWrapper.java","lineNumber":255,"sourceCode":"    }\n\n    int arraySize = BinaryVariantAccessorUtils.arraySize(variant);\n    Object[] elements = new Object[arraySize];\n\n    for (int i = 0; i < arraySize; i++) {\n      Variant element = variant.getElement(i);\n      elements[i] = elementValue(element, innerElementType);\n    }\n\n    return new GenericArrayData(elements);\n  }\n\n  private static int intValue(Variant variant) {\n    return switch (variant.getType()) {\n      case TINYINT -> variant.getByte();\n      case SMALLINT -> variant.getShort();\n      case INT -> variant.getInt();\n      default -> throw new UnsupportedOperationException(errMsg(variant, \"int\"));\n    };\n  }\n\n  private static long longValue(Variant variant) {\n    return switch (variant.getType()) {\n      case TINYINT -> variant.getByte();\n      case SMALLINT -> variant.getShort();\n      case INT -> variant.getInt();\n      case BIGINT -> variant.getLong();\n      default -> throw new UnsupportedOperationException(errMsg(variant, \"long\"));\n    };\n  }\n\n  private static double doubleValue(Variant variant) {\n    return switch (variant.getType()) {\n      case FLOAT -> variant.getFloat();\n      case DOUBLE -> variant.getDouble();\n      default -> throw new UnsupportedOperationException(errMsg(variant, \"double\"));","sourceCodeStart":237,"sourceCodeEnd":273,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/data/VariantRowDataWrapper.java#L237-L273","documentation":"intValue extracts an int from a Variant only when its Variant.Type is TINYINT, SMALLINT, or INT; any other physical type (e.g. BIGINT, DOUBLE, STRING) throws this UnsupportedOperationException via errMsg(variant, \"int\").","triggerScenarios":"Calling getInt on a VariantRowDataWrapper whose column holds a Variant of an incompatible type, or elementValue widening an int-typed field whose variant is e.g. a long.","commonSituations":"Schema/variant type mismatch after table evolution (column changed from int to long) or writers producing variants of the wrong physical type.","solutions":["Check variant.getType() at the source and ensure the writer emits an int-width value","Align the Flink RowType column to INT (not BIGINT) or read with getLong instead","Coerce the variant upstream (cast the value) before writing it into the variant column"],"exampleFix":"// before\nrow.getInt(3); // variant is BIGINT -> throws\n// after\nlong v = row.getLong(3); // matches BIGINT variant","handlingStrategy":"try-catch","validationCode":"if (variant.getType() != Variant.Type.TINYINT\n    && variant.getType() != Variant.Type.SMALLINT\n    && variant.getType() != Variant.Type.INT) { /* coerce or use getLong */ }","typeGuard":"boolean isIntWidth(Variant v) {\n  return v.getType() == Variant.Type.TINYINT || v.getType() == Variant.Type.SMALLINT\n      || v.getType() == Variant.Type.INT;\n}","tryCatchPattern":"try { int i = row.getInt(pos); }\ncatch (UnsupportedOperationException e) { long l = row.getLong(pos); int i = (int) l; }","preventionTips":["Match writer variant physical types to declared column types","Avoid evolving int columns to long without updating readers","Log variant.getType() when diagnosing type mismatches"],"tags":["flink","variant","type-mismatch"],"backgroundTag":"type-mismatch","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}