dbt-labs/dbt-core · error

is_replaceable is only available with BigQuery adapter, not

Error message

is_replaceable is only available with BigQuery adapter, not {}

What it means

unimplemented!() in is_replaceable: deciding whether a relation can be replaced in place (partition/cluster match) is only meaningful and implemented for BigQuery; every other adapter type falls into this arm and aborts.

Solutions

  1. Default non-BigQuery adapters to a dbt-core-compatible value (false/true) instead of aborting
  2. Feature-gate the materialization code that calls is_replaceable to BigQuery
  3. Return a structured AdapterError instead of unimplemented!()
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at crates/dbt-adapter/src/adapter/adapter_impl.rs:3818 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at crates/dbt-adapter/src/adapter/adapter_impl.rs:3818

                        let is_cluster_match = local_cluster_by
                            .diff_from(Some(remote_cluster_by.as_ref()))
                            .is_none();

                        Ok(is_partition_match && is_cluster_match)
                    }
                    Err(e) => {
                        if e.kind() == AdapterErrorKind::NotFound {
                            Ok(true)
                        } else {
                            Err(e)
                        }
                    }
                }
            }
            adapter_type @ (Postgres | Snowflake | Databricks | Redshift | Salesforce | Spark
            | DuckDB | LakeCompute | Fabric | ClickHouse | Exasol | Starburst
            | Athena | Trino | Datafusion | Dremio | Oracle) => {
                unimplemented!(
                    "is_replaceable is only available with BigQuery adapter, not {}",
                    adapter_type
                )
            }
        }
    }

    /// BigQueryAdapter https://github.com/dbt-labs/dbt-adapters/blob/0efd8d3d1081e1ab43e38797d5104f7b424a6284/dbt-bigquery/src/dbt/adapters/bigquery/impl.py#L956
    pub fn upload_file(&self, _state: &State, _args: &[Value]) -> Result<Value, minijinja::Error> {
        unimplemented!("upload_file")
    }

    /// BigQueryAdapter https://github.com/dbt-labs/dbt-adapters/blob/0efd8d3d1081e1ab43e38797d5104f7b424a6284/dbt-bigquery/src/dbt/adapters/bigquery/impl.py#L670
    pub fn parse_partition_by(&self, partition_by: Value) -> AdapterResult<Value> {
        match self.adapter_type() {
            Bigquery => {
                // https://github.com/dbt-labs/dbt-adapters/blob/main/dbt-bigquery/src/dbt/adapters/bigquery/impl.py#L579-L586
                // Pure config parse; safe for both BigQuery and Replay (when adapter type is BigQuery)

View on GitHub (pinned to 0267ce9170)