{"record":{"id":"6b3f7c32c0d66b87","repo":"apache/iceberg","slug":"unknown-dummy-vector-holder-holder-6b3f7c","errorCode":null,"errorMessage":"Unknown dummy vector holder: ${holder}","messagePattern":"Unknown dummy vector holder: (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnVectorBuilder.java","lineNumber":41,"sourceCode":"import org.apache.iceberg.types.Type;\nimport org.apache.iceberg.types.Types;\nimport org.apache.spark.sql.vectorized.ColumnVector;\n\nclass ColumnVectorBuilder {\n\n  public ColumnVector build(VectorHolder holder, int numRows) {\n    if (holder instanceof VectorHolder.VariantVectorHolder) {\n      return new VariantColumnVector((VectorHolder.VariantVectorHolder) holder);\n    } else if (holder.isDummy()) {\n      if (holder instanceof VectorHolder.DeletedVectorHolder) {\n        return new DeletedColumnVector(Types.BooleanType.get());\n      } else if (holder instanceof ConstantVectorHolder) {\n        ConstantVectorHolder<?> constantHolder = (ConstantVectorHolder<?>) holder;\n        Type icebergType = constantHolder.icebergType();\n        Object value = constantHolder.getConstant();\n        return new ConstantColumnVector(icebergType, numRows, value);\n      } else {\n        throw new IllegalStateException(\"Unknown dummy vector holder: \" + holder);\n      }\n    } else {\n      return new IcebergArrowColumnVector(holder);\n    }\n  }\n}\n","sourceCodeStart":23,"sourceCodeEnd":48,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnVectorBuilder.java#L23-L48","documentation":"ColumnVectorBuilder.build converts dummy vector holders used during vectorized reads (NULL, constant) into Spark ColumnVectors. If a holder is neither a NullVectorHolder-like case nor a ConstantVectorHolder, the builder cannot classify it and throws IllegalStateException.","triggerScenarios":"readDataToColumnVectors passes a VectorHolder that is a dummy type not recognized by build (a new dummy holder kind introduced elsewhere but not handled here), i.e. an internal invariant violation in the vectorized read path.","commonSituations":"Almost always an Iceberg-internal bug or a mixed-version deployment where a newer component produces a holder type an older builder doesn't know.","solutions":["Ensure all iceberg-spark jars in the classpath are the same version (no mixed-version shading).","Report/log the holder class name — it identifies which code path created the unknown holder.","Work around by disabling vectorized reads for the affected scan if a hotfix is unavailable."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  vectors = readDataToColumnVectors(task, expectedTypes, batch); \n} catch (IllegalStateException e) {\n  if (e.getMessage().startsWith(\"Unknown dummy vector holder\")) {\n    // fall back to non-vectorized read path\n    spark.conf().set(\"read.spark.vectorization.enabled\", \"false\");\n  }\n}","preventionTips":["Never mix iceberg-spark jar versions on the classpath","Upgrade all Iceberg modules together","File an issue with the holder class name from the message"],"tags":["spark","vectorized-read","columnar","internal"],"backgroundTag":"internal-invariant-violation","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"}