{"record":{"id":"f5997223f921b253","repo":"apache/iceberg","slug":"create-view-column-arity-mismatch-too-many-data-co-f59972","errorCode":"CREATE_VIEW_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS","errorMessage":"CREATE_VIEW_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS","messagePattern":"CREATE_VIEW_COLUMN_ARITY_MISMATCH\\.TOO_MANY_DATA_COLUMNS","errorType":"error_code","errorClass":"AnalysisException","httpStatus":null,"severity":"error","filePath":"spark/v4.1/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckViews.scala","lineNumber":84,"sourceCode":"\n      case _ => // OK\n    }\n  }\n\n  private def verifyColumnCount(\n      ident: ResolvedIdentifier,\n      columns: Seq[String],\n      query: LogicalPlan): Unit = {\n    if (columns.nonEmpty) {\n      if (columns.length > query.output.length) {\n        throw new AnalysisException(\n          errorClass = \"CREATE_VIEW_COLUMN_ARITY_MISMATCH.NOT_ENOUGH_DATA_COLUMNS\",\n          messageParameters = Map(\n            \"viewName\" -> String.format(\"%s.%s\", ident.catalog.name(), ident.identifier),\n            \"viewColumns\" -> columns.mkString(\", \"),\n            \"dataColumns\" -> query.output.map(c => c.name).mkString(\", \")))\n      } else if (columns.length < query.output.length) {\n        throw new AnalysisException(\n          errorClass = \"CREATE_VIEW_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS\",\n          messageParameters = Map(\n            \"viewName\" -> String.format(\"%s.%s\", ident.catalog.name(), ident.identifier),\n            \"viewColumns\" -> columns.mkString(\", \"),\n            \"dataColumns\" -> query.output.map(c => c.name).mkString(\", \")))\n      }\n    }\n  }\n\n  private def checkCyclicViewReference(\n      viewIdent: Seq[String],\n      plan: LogicalPlan,\n      cyclePath: Seq[Seq[String]]): Unit = {\n    plan match {\n      case sub @ SubqueryAlias(_, Project(_, _)) =>\n        val currentViewIdent: Seq[String] = sub.identifier.qualifier :+ sub.identifier.name\n        checkIfRecursiveView(viewIdent, currentViewIdent, cyclePath, sub.children)\n      case v1View: View =>","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.1/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckViews.scala#L66-L102","documentation":"When creating an Iceberg view, the declared column list has FEWER names than the view's query produces. CheckViews.verifyColumnCount throws Spark's standard CREATE_VIEW_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS AnalysisException with viewName/viewColumns/dataColumns parameters.","triggerScenarios":"`CREATE VIEW v (a) AS SELECT x, y, z FROM ...` — explicit column list length is less than the number of columns output by the query, detected on the Iceberg v2 view path.","commonSituations":"CREATE VIEW column lists not updated after the SELECT gains columns; copy-paste of view DDL between tables with different schemas.","solutions":["Add column names to the declared list so it matches the query output count","Remove columns from the SELECT to match the declared list","Drop the explicit column list and alias columns directly in the SELECT"],"exampleFix":"// before\nCREATE VIEW v (a) AS SELECT id, name FROM t\n// after\nCREATE VIEW v (a, b) AS SELECT id, name FROM t","handlingStrategy":"validation","validationCode":"val q = spark.sql(viewQuery); require(declaredCols.length == q.schema.length, s\"view declares ${declaredCols.length} columns but query outputs ${q.schema.length}\")","typeGuard":null,"tryCatchPattern":"try { spark.sql(createViewDdl) } catch { case e: AnalysisException if e.getErrorClass.contains(\"CREATE_VIEW_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS\") => /* extend the column list */ }","preventionTips":["Regenerate column lists whenever the query changes","Drop explicit column lists when query aliases already name columns","Validate DDL in CI with a dry parse/schema check"],"tags":["spark","views","column-arity","sql-extensions"],"backgroundTag":"schema-validation-failed","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"}