dbt-labs/dbt-core · error

Available only for BigQuery and Redshift

Error message

Available only for BigQuery and Redshift

What it means

This method on the relation config computes a changeset of alterations, but only the BigQuery and Redshift arms of the match are implemented; any other adapter type falls to the catch-all and panics with unimplemented!("Available only for BigQuery and Redshift"). It reflects that change-detection semantics (e.g. column/option diffs) are only defined for those two platforms.

Solutions

  1. Only call the changeset method for BigQuery/Redshift relations; branch on adapter type before diffing.
  2. For other adapters, implement platform-specific diff logic or compare relation columns/options manually.
  3. If BigQuery/Redshift behavior is intended, verify the relation's adapter_type is set correctly (e.g. fix an adapter-type mislabeling in the profile).

Example fix

// before
let changeset = relation_config.changeset();

// after
let changeset = match adapter_type {
    AdapterType::Bigquery | AdapterType::Redshift => relation_config.changeset(),
    _ => None,
};
Defensive patterns

Strategy: validation

Validate before calling

let supported = matches!(adapter_type, AdapterType::Bigquery | AdapterType::Redshift);
if !supported { /* skip changeset diff */ }

Type guard

fn supports_changeset(t: &AdapterType) -> bool { matches!(t, AdapterType::Bigquery | AdapterType::Redshift) }

Prevention

When it happens

Trigger: Invoking the changeset/alteration-diff method on a relation config whose adapter type is neither BigQuery nor Redshift — e.g. computing a column changeset on Snowflake, Databricks, or Postgres relations.

Common situations: Incremental materialization logic that diffs model config against the existing relation; macros shared across warehouses calling the changeset helper; adapters whose materialized-view workflows are not yet migrated to RelationConfig v2 (see the adjacent FIXME about Redshift).

Related errors


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

Appendix: source

Thrown at crates/dbt-adapter/src/relation/relation_impl.rs:1329

                        return Err(minijinja::Error::new(
                            minijinja::ErrorKind::InvalidOperation,
                            "Expected a model node",
                        ));
                    }
                };
                let desired_state =
                    crate::relation::bigquery::config::relation_types::materialized_view::new_loader()
                        .from_local_config(local_config.as_ref())?;

                let changeset = RelationConfig::diff(&desired_state, current_state);

                if changeset.is_empty() {
                    Ok(none_value())
                } else {
                    Ok(Value::from_object(changeset))
                }
            }
            _ => unimplemented!("Available only for BigQuery and Redshift"),
        }
    }
}

// FIXME(serramatutu): this should be deleted from here once Redshift Materialized
// Views are migrated to RelationConfig v2.
fn node_value_to_redshift_materialized_view(
    node_value: &Value,
) -> Result<RedshiftMaterializedViewConfig, minijinja::Error> {
    let config_wrapper = InternalDbtNodeWrapper::deserialize(node_value).map_err(|e| {
        minijinja::Error::new(
            minijinja::ErrorKind::SerdeDeserializeError,
            format!("Failed to deserialize InternalDbtNodeWrapper: {e}"),
        )
    })?;

    let model = match config_wrapper {
        InternalDbtNodeWrapper::Model(model) => model,

View on GitHub (pinned to 0267ce9170)