{"record":{"id":"abc1a6b2cbc5cd76","repo":"apache/iceberg","slug":"errmsg-variant-int","errorCode":null,"errorMessage":"errMsg(variant, \"int\")","messagePattern":"errMsg\\(variant, \"int\"\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.2/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.2/flink/src/main/java/org/apache/iceberg/flink/data/VariantRowDataWrapper.java#L237-L273","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Check the variant's actual stored type and read it with a matching Flink logical type (BIGINT -> getLong, etc.).","Fix the schema/type mapping so the Flink field type matches the variant's declared physical type.","If casting is intended, convert the variant value (e.g. via variant type switch or SQL CAST) before wrapping."],"exampleFix":"// before\nint v = wrapper.getInt(variantPos);\n// after\nif (variant.getType() == Variant.Type.BIGINT) {\n  long v = wrapper.getLong(variantPos);\n}","handlingStrategy":"type-guard","validationCode":"if (variant.getType() == Variant.Type.TINYINT || variant.getType() == Variant.Type.SMALLINT || variant.getType() == Variant.Type.INT) { /* safe to getInt */ }","typeGuard":"boolean isIntVariant(Variant v) { return switch (v.getType()) { case TINYINT, SMALLINT, INT -> true; default -> false; }; }","tryCatchPattern":"try { int v = wrapper.getInt(pos); } catch (UnsupportedOperationException e) { /* fallback: read via matching accessor or log type mismatch */ }","preventionTips":["Verify the variant's stored type before mapping it to a Flink field type.","Keep the Iceberg/Flink schema in sync with the data written into variant columns.","Add unit tests covering each variant physical type per Flink field type."],"tags":["flink","variant","type-mismatch"],"backgroundTag":"unsupported-operation","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"}