{"record":{"id":"7a1f2d7645ec8666","repo":"apache/iceberg","slug":"cannot-unset-reserved-property-property","errorCode":null,"errorMessage":"Cannot unset reserved property: '$property'","messagePattern":"Cannot unset reserved property: '\\$property'","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.2/spark-extensions/src/main/scala/org/apache/spark/sql/execution/datasources/v2/IcebergAlterV2ViewUnsetPropertiesExec.scala","lineNumber":78,"sourceCode":"      ViewUtil\n        .loadIcebergView(catalog, ident)\n        .getOrElse(\n          throw new IllegalStateException(s\"Cannot load underlying Iceberg view for view: $ident\"))\n    val update = view.updateProperties()\n    propertyKeys.foreach(update.remove)\n    CommandUtils.uncacheTableOrView(session, ResolvedIdentifier(catalog, ident))\n    update.commit()\n\n    Nil\n  }\n\n  override def simpleString(maxFields: Int): String = {\n    s\"IcebergAlterV2ViewUnsetProperties: ${ident}\"\n  }\n\n  private def verifyNonReservedPropertyIsUnset(property: String): Unit = {\n    if (SparkView.isReservedProperty(property)) {\n      throw new UnsupportedOperationException(s\"Cannot unset reserved property: '$property'\")\n    }\n  }\n}\n","sourceCodeStart":60,"sourceCodeEnd":82,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.2/spark-extensions/src/main/scala/org/apache/spark/sql/execution/datasources/v2/IcebergAlterV2ViewUnsetPropertiesExec.scala#L60-L82","documentation":"Iceberg reserves certain view property keys for internal bookkeeping (metadata location, provider, etc.). Unsetting them through `ALTER VIEW ... UNSET TBLPROPERTIES` would corrupt view metadata, so the executor rejects reserved keys with an UnsupportedOperationException via `SparkView.isReservedProperty`.","triggerScenarios":"Calling `verifyNonReservedPropertyIsUnset` with a key that `SparkView.isReservedProperty` returns true for, typically via `ALTER VIEW ... UNSET TBLPROPERTIES ('provider', ...)` or similar reserved keys.","commonSituations":"Scripts that blindly unset a list of properties including reserved ones; attempts to 'clean up' properties that look user-defined but are internal; migrating views and resetting all properties.","solutions":["Remove reserved keys from the UNSET list","Only unset properties shown as user-defined in `SHOW TBLPROPERTIES`","If the intent is to replace the view, use CREATE OR REPLACE instead of unsetting internal properties"],"exampleFix":"// before\nALTER VIEW v UNSET TBLPROPERTIES ('provider', 'x.y')\n// after\nALTER VIEW v UNSET TBLPROPERTIES ('x.y') -- drop only user-defined properties","handlingStrategy":"validation","validationCode":"val reserved = Set(\"location\",\"provider\",\"format-provider\",\"metadata.previous-location\",\"metadata.current-location\")\nrequire((keysToUnset & reserved).isEmpty, s\"reserved keys: ${(keysToUnset & reserved).mkString(\",\")}\")","typeGuard":null,"tryCatchPattern":"try { spark.sql(unsetSql) } catch { case e: UnsupportedOperationException if e.getMessage.contains(\"reserved property\") => /* filter out reserved keys and retry */ }","preventionTips":["Filter out reserved keys (check SparkView.isReservedProperty or the documented reserved list) before UNSET","Only unset properties you created yourself","Never attempt to clear provider/metadata properties"],"tags":["spark","sql","view-properties","reserved-property"],"backgroundTag":"invalid-argument-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}