dbt-labs/dbt-core · error · minijinja::Error::InvalidOperation
parse_columns_and_constraints is only available for Databric
Error message
parse_columns_and_constraints is only available for Databricks/Spark adapter
What it means
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.
Source
Thrown at crates/dbt-adapter/src/adapter/adapter_impl.rs:4643
///
/// Returns [enriched_columns, typed_constraints] for use with get_column_and_constraints_sql
/// and relation.enrich().
///
/// DatabricksAdapter https://github.com/databricks/dbt-databricks/blob/45351e11517d3f37c5ac7a736b5fcba453d3f368/dbt/adapters/databricks/impl.py#L1038
pub fn parse_columns_and_constraints(
&self,
_state: &State,
existing_columns: &Value,
model_columns: &Value,
model_constraints: &Value,
contract_enforced: bool,
model_name: &str,
) -> Result<Value, minijinja::Error> {
use crate::relation::databricks::typed_constraint;
use std::collections::{BTreeMap, BTreeSet};
if self.adapter_type() != Databricks && self.adapter_type() != Spark {
return Err(minijinja::Error::new(
minijinja::ErrorKind::InvalidOperation,
"parse_columns_and_constraints is only available for Databricks/Spark adapter",
));
}
let columns: Vec<Column> = existing_columns
.try_iter()
.map_err(|e| {
minijinja::Error::new(
minijinja::ErrorKind::InvalidOperation,
format!("existing_columns must be iterable: {e}"),
)
})?
.map(|v| {
v.downcast_object_ref::<Column>().cloned().ok_or_else(|| {
minijinja::Error::new(
minijinja::ErrorKind::InvalidOperation,
"existing_columns must contain Column objects",View on GitHub (pinned to 0267ce9170)
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.
Example fix
// before
parsed = adapter.parse_columns_and_constraints(existing_columns, model_columns, model_name)
// after
if adapter.type() in ('databricks', 'spark'):
parsed = adapter.parse_columns_and_constraints(existing_columns, model_columns, model_name)
else:
parsed = model_columns Defensive patterns
Strategy: type-guard
Validate before calling
def supports_columns_and_constraints(adapter_type):
return adapter_type in ('databricks', 'spark') Type guard
def is_databricks_or_spark(adapter_type):
return adapter_type in ('databricks', 'spark') Try / catch
try:
parsed = adapter.parse_columns_and_constraints(existing, model_columns, name)
except Exception as e:
if 'Databricks/Spark adapter' in str(e):
parsed = model_columns # fallback for other adapters
else:
raise Prevention
- 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
When it happens
Trigger: Calling parse_columns_and_constraints while self.adapter_type() is neither Databricks nor Spark — e.g. under Postgres, Snowflake, or BigQuery.
Common situations: Reusing a Databricks custom materialization macro on another warehouse; running a project with mixed adapters where the macro doesn't dispatch on adapter type.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- render_constraints_for_create is only available for Databric
- {type(df)} is not a supported type for dbt Python materializ
- only available with Databricksadapter
- only available with Databricks adapter
- resolve_file_format is only supported in Databricks
AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07).
Data as JSON: /api/errors/4c9f54f278b11aa2.
Report an issue: GitHub.