dbt-labs/dbt-core · error

is_uniform is only supported in Databricks

Error message

is_uniform is only supported in Databricks

What it means

The `is_uniform` adapter method checks whether a table is managed via Databricks Uniform (Iceberg); it is gated to the Databricks adapter and panics with `unimplemented!` for every other adapter type. Because 'Uniform' is a Databricks-only concept, the generic Adapter wrapper refuses to execute the method elsewhere. The panic occurs before any argument parsing, so even valid arguments cannot prevent it on a non-Databricks adapter.

Source

Thrown at crates/dbt-adapter/src/adapter/mod.rs:2954

                Ok(Value::from_serialize(&tblproperties))
            }
            Parse(_) => Ok(empty_map_value()),
        }
    }

    /// Is table UniForm Iceberg
    ///
    /// https://github.com/databricks/dbt-databricks/blob/bfcb5c7c7714e97e67023119f674d2938b04acb0/dbt/adapters/databricks/impl.py#L256C6-L256C7
    ///
    /// ```python
    /// def is_uniform(self, config: BaseConfig) -> bool:
    /// ```
    #[tracing::instrument(skip(self, state), level = "trace")]
    pub fn is_uniform(&self, state: &State, args: &[Value]) -> Result<Value, minijinja::Error> {
        match &self.inner {
            Typed { adapter, .. } => {
                if adapter.adapter_type() != AdapterType::Databricks {
                    unimplemented!("is_uniform is only supported in Databricks")
                }

                let iter = ArgsIter::new("is_uniform", &["config"], args);
                let config_val = iter.next_arg::<&Value>()?;
                iter.finish()?;

                let model_val = config_val.get_attr("model").map_err(|e| {
                    minijinja::Error::new(
                        minijinja::ErrorKind::InvalidArgument,
                        format!("is_uniform: config.model is required: {e}"),
                    )
                })?;
                let config = minijinja_value_to_typed_struct::<ModelConfig>(config_val.clone())
                    .map_err(|e| {
                        minijinja::Error::new(
                            minijinja::ErrorKind::SerdeDeserializeError,
                            e.to_string(),
                        )

View on GitHub (pinned to 0267ce9170)

Solutions

  1. Guard the call with an adapter-type check (`adapter.type() == 'databricks'`) and return a sensible default (e.g. false/None) for other adapters.
  2. Ensure models calling is_uniform are only selected when running on the Databricks target.
  3. Refactor shared macros so Databricks-only logic lives in Databricks-dispatched macros.

Example fix

// before
{% set uniform = adapter.is_uniform(config) %}
// after
{% set uniform = adapter.is_uniform(config) if adapter.type() == 'databricks' else false %}
Defensive patterns

Strategy: type-guard

Validate before calling

// Jinja
{% set is_databricks = adapter.type() == 'databricks' %}

Type guard

fn supports_uniform(a: &Adapter) -> bool {
    a.adapter_type() == AdapterType::Databricks
}

Try / catch

// Branch instead of catching
{% set uniform = false %}
{% if adapter.type() == 'databricks' %}
  {% set uniform = adapter.is_uniform(config) %}
{% endif %}

Prevention

When it happens

Trigger: Calling `adapter.is_uniform(state, [config])` from Jinja while the active adapter's type is not AdapterType::Databricks — e.g. checking uniform status in a macro executed on Snowflake or BigQuery.

Common situations: Databricks-specific models copied into a multi-warehouse project; shared packages that call is_uniform without an adapter-type guard; switching targets in CI so Databricks macros run against other warehouses.

Related errors


AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07). Data as JSON: /api/errors/2c935c3dca3749c7. Report an issue: GitHub.