{"record":{"id":"84b16c76dd0d24b2","repo":"apache/iceberg","slug":"not-a-supported-type-flinkvariant-getclass-84b16c","errorCode":null,"errorMessage":"Not a supported type: \" + flinkVariant.getClass()","messagePattern":"Not a supported type: \" \\+ flinkVariant\\.getClass\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/data/FlinkVariantShreddingAnalyzer.java","lineNumber":58,"sourceCode":"  protected List<VariantValue> extractVariantValues(\n      List<RowData> bufferedRows, int variantFieldIndex) {\n    List<VariantValue> values = Lists.newArrayList();\n\n    for (RowData row : bufferedRows) {\n      if (!row.isNullAt(variantFieldIndex)) {\n        Variant flinkVariant = row.getVariant(variantFieldIndex);\n        if (flinkVariant != null) {\n          if (flinkVariant instanceof BinaryVariant binaryVariant) {\n            VariantValue variantValue =\n                VariantValue.from(\n                    VariantMetadata.from(\n                        ByteBuffer.wrap(binaryVariant.getMetadata())\n                            .order(ByteOrder.LITTLE_ENDIAN)),\n                    ByteBuffer.wrap(binaryVariant.getValue()).order(ByteOrder.LITTLE_ENDIAN));\n\n            values.add(variantValue);\n          } else {\n            throw new UnsupportedOperationException(\n                \"Not a supported type: \" + flinkVariant.getClass());\n          }\n        }\n      }\n    }\n\n    return values;\n  }\n\n  @Override\n  protected int resolveColumnIndex(RowType flinkSchema, String columnName) {\n    return flinkSchema.getFieldIndex(columnName);\n  }\n}\n","sourceCodeStart":40,"sourceCodeEnd":73,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/data/FlinkVariantShreddingAnalyzer.java#L40-L73","documentation":"FlinkVariantShreddingAnalyzer.extractVariantValues converts a Flink Variant from RowData into an Iceberg VariantValue for variant shredding analysis. It only knows how to handle org.apache.flink.types.variant.BinaryVariant (the serialized metadata+value representation). If the RowData.getVariant() call returns a Variant implementation of any other class, the analyzer throws UnsupportedOperationException naming the unexpected class.","triggerScenarios":"Calling variant shredding analysis (e.g. via rewrite data files / variant shredding support) on Flink RowData whose variant field is a non-BinaryVariant Variant implementation, i.e. row.getVariant(variantFieldIndex) returns a class other than BinaryVariant.","commonSituations":"Using a Flink runtime or connector that materializes Variant objects with a different implementation class than the BinaryVariant produced by the standard binary encoding; running a Flink version whose Variant API differs from the one iceberg-flink-runtime 2.2 was built against; custom RowData wrappers returning their own Variant implementations.","solutions":["Ensure the variant field in the RowData is backed by BinaryVariant (standard little-endian metadata/value encoding) before running shredding analysis.","Check the Flink version used at runtime matches the iceberg-flink module's expected Flink 2.2 Variant API so getVariant() returns BinaryVariant.","If a custom Variant implementation is in play, convert it to bytes (metadata+value) and wrap it in BinaryVariant upstream of the analyzer.","If you control the code, extend the analyzer's else branch to support the extra Variant class explicitly."],"exampleFix":"// before\nVariant flinkVariant = row.getVariant(variantFieldIndex);\nshreddingAnalyzer.analyze(row);\n\n// after\nVariant flinkVariant = row.getVariant(variantFieldIndex);\nif (!(flinkVariant instanceof BinaryVariant)) {\n  throw new IllegalArgumentException(\"Variant field must be BinaryVariant, got: \" + flinkVariant.getClass());\n}\nshreddingAnalyzer.analyze(row);","handlingStrategy":"type-guard","validationCode":"Variant v = row.getVariant(variantFieldIndex);\nif (v != null && !(v instanceof BinaryVariant)) {\n  throw new IllegalArgumentException(\"Variant must be BinaryVariant, got: \" + v.getClass());\n}","typeGuard":"boolean isBinaryVariant(Variant v) {\n  return v == null || v instanceof BinaryVariant;\n}","tryCatchPattern":"try {\n  analyzer.analyze(rows);\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Not a supported type:\")) {\n    log.error(\"Variant implementation not supported for shredding\", e);\n    return fallbackShreddingPlan(rows);\n  }\n  throw e;\n}","preventionTips":["Pin the Flink runtime to the version matching your iceberg-flink module so getVariant() returns BinaryVariant.","Assert variant field types in a unit test before running shredding jobs."],"tags":["flink","variant","unsupported-type","shredding"],"backgroundTag":"incompatible-source-type","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}