{"record":{"id":"4c9f54f278b11aa2","repo":"dbt-labs/dbt-core","slug":"parse-columns-and-constraints-is-only-available-fo","errorCode":null,"errorMessage":"parse_columns_and_constraints is only available for Databricks/Spark adapter","messagePattern":"parse_columns_and_constraints is only available for Databricks/Spark adapter","errorType":"exception","errorClass":"minijinja::Error::InvalidOperation","httpStatus":null,"severity":"error","filePath":"crates/dbt-adapter/src/adapter/adapter_impl.rs","lineNumber":4643,"sourceCode":"    ///\n    /// Returns [enriched_columns, typed_constraints] for use with get_column_and_constraints_sql\n    /// and relation.enrich().\n    ///\n    /// DatabricksAdapter https://github.com/databricks/dbt-databricks/blob/45351e11517d3f37c5ac7a736b5fcba453d3f368/dbt/adapters/databricks/impl.py#L1038\n    pub fn parse_columns_and_constraints(\n        &self,\n        _state: &State,\n        existing_columns: &Value,\n        model_columns: &Value,\n        model_constraints: &Value,\n        contract_enforced: bool,\n        model_name: &str,\n    ) -> Result<Value, minijinja::Error> {\n        use crate::relation::databricks::typed_constraint;\n        use std::collections::{BTreeMap, BTreeSet};\n\n        if self.adapter_type() != Databricks && self.adapter_type() != Spark {\n            return Err(minijinja::Error::new(\n                minijinja::ErrorKind::InvalidOperation,\n                \"parse_columns_and_constraints is only available for Databricks/Spark adapter\",\n            ));\n        }\n\n        let columns: Vec<Column> = existing_columns\n            .try_iter()\n            .map_err(|e| {\n                minijinja::Error::new(\n                    minijinja::ErrorKind::InvalidOperation,\n                    format!(\"existing_columns must be iterable: {e}\"),\n                )\n            })?\n            .map(|v| {\n                v.downcast_object_ref::<Column>().cloned().ok_or_else(|| {\n                    minijinja::Error::new(\n                        minijinja::ErrorKind::InvalidOperation,\n                        \"existing_columns must contain Column objects\",","sourceCodeStart":4625,"sourceCodeEnd":4661,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-adapter/src/adapter/adapter_impl.rs#L4625-L4661","documentation":"parse_columns_and_constraints parses existing columns plus model constraints into Databricks/Spark constraint syntax, and is explicitly restricted to the Databricks and Spark adapters. Any other adapter type immediately raises an InvalidOperation error before any parsing happens.","triggerScenarios":"Calling parse_columns_and_constraints while self.adapter_type() is neither Databricks nor Spark — e.g. under Postgres, Snowflake, or BigQuery.","commonSituations":"Reusing a Databricks custom materialization macro on another warehouse; running a project with mixed adapters where the macro doesn't dispatch on adapter type.","solutions":["Only call parse_columns_and_constraints from Databricks or Spark models/macros.","Add an adapter-type guard in your macro with a graceful fallback for other adapters.","Move constraint parsing into adapter-conditional logic if the materialization is shared.","Check the adapter configured in profiles.yml matches what the model's materialization expects."],"exampleFix":"// before\nparsed = adapter.parse_columns_and_constraints(existing_columns, model_columns, model_name)\n\n// after\nif adapter.type() in ('databricks', 'spark'):\n    parsed = adapter.parse_columns_and_constraints(existing_columns, model_columns, model_name)\nelse:\n    parsed = model_columns","handlingStrategy":"type-guard","validationCode":"def supports_columns_and_constraints(adapter_type):\n    return adapter_type in ('databricks', 'spark')","typeGuard":"def is_databricks_or_spark(adapter_type):\n    return adapter_type in ('databricks', 'spark')","tryCatchPattern":"try:\n    parsed = adapter.parse_columns_and_constraints(existing, model_columns, name)\nexcept Exception as e:\n    if 'Databricks/Spark adapter' in str(e):\n        parsed = model_columns  # fallback for other adapters\n    else:\n        raise","preventionTips":["Dispatch on adapter.type() before calling Databricks/Spark-only APIs","Keep constraint parsing in Databricks/Spark-specific materializations","Check profiles.yml adapter matches the materialization's expectations","Document adapter requirements on shared macros"],"tags":["adapter","databricks","spark","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}