{"record":{"id":"76deab480d0cf5b6","repo":"apache/iceberg","slug":"unknown-dummy-vector-holder-holder","errorCode":null,"errorMessage":"Unknown dummy vector holder: ${holder}","messagePattern":"Unknown dummy vector holder: (.+?)","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnVectorBuilder.java","lineNumber":39,"sourceCode":"import org.apache.iceberg.arrow.vectorized.VectorHolder;\nimport org.apache.iceberg.arrow.vectorized.VectorHolder.ConstantVectorHolder;\nimport 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.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":21,"sourceCodeEnd":46,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnVectorBuilder.java#L21-L46","documentation":"During vectorized Spark reads, Iceberg builds result column vectors from 'dummy vector holders' used for constant/padding columns. ColumnVectorBuilder.build recognizes specific holder classes (constant holders, etc.); if a holder of an unexpected class is passed, it throws IllegalStateException because the builder cannot produce a valid column vector for it. This indicates an internal inconsistency in how the batch was constructed rather than bad user data.","triggerScenarios":"A vectorized read (spark.sql.iceberg.vectorization.enabled=true) where readDataToColumnVectors encounters a VectorHolder that is neither an IcebergArrowColumnVector-backed holder nor any of the recognized dummy holder types (constant, deleted-row, etc.) — i.e., a new dummy holder type added without updating the builder.","commonSituations":"Mixed Iceberg runtime versions on the classpath (a holder class from a newer/older jar); custom vectorized-read patches; a metadata column or constant-folded expression producing a holder the builder doesn't know.","solutions":["Check the classpath for duplicate/mismatched iceberg-spark jars and align all Iceberg artifacts to one version","Disable vectorized reads as a workaround: set spark.sql.iceberg.vectorization.enabled=false","Upgrade Iceberg so the holder type and ColumnVectorBuilder are from the same compatible release","If a custom holder was added, extend ColumnVectorBuilder.build to handle it"],"exampleFix":"// before: spark-sql default with mixed iceberg jars\nspark.sql(...)\n// after: disable vectorization to isolate/avoid\nspark.conf.set(\"spark.sql.iceberg.vectorization.enabled\", \"false\")","handlingStrategy":"try-catch","validationCode":"// Ensure a single consistent Iceberg version on the classpath\n// ./gradlew dependencies | grep iceberg  — no duplicate/mixed iceberg-spark versions","typeGuard":null,"tryCatchPattern":"try {\n  spark.read.format(\"iceberg\").load(\"db.table\").collect();\n} catch (IllegalStateException e) {\n  if (e.getMessage().startsWith(\"Unknown dummy vector holder:\")) {\n    spark.conf.set(\"spark.sql.iceberg.vectorization.enabled\", \"false\"); // fallback\n  } else throw e;\n}","preventionTips":["Align all Iceberg artifacts to the same version (no mixed jars)","After upgrading, clear cached jars/confs from older releases","Be cautious with custom VectorHolder implementations — update ColumnVectorBuilder for any new holder type"],"tags":["spark","vectorized-read","columnar","internal-state"],"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-14T11:17:12.474Z"}