dbt-labs/dbt-core · critical
Oracle
Error message
Oracle
What it means
A `todo!()` panic raised when `metadata_adapter` tries to construct a metadata adapter for the Oracle adapter type. The dispatch match at crates/dbt-adapter/src/adapter/adapter_impl.rs:318-323 has no Oracle implementation, so reaching the arm panics with the message "Oracle". This marks Oracle support as deliberately unfinished in the metadata adapter layer.
Source
Thrown at crates/dbt-adapter/src/adapter/adapter_impl.rs:323
Box::new(DuckDBMetadataAdapter::new(engine)) as Box<dyn MetadataAdapter>
}
LakeCompute => {
Box::new(DuckDBMetadataAdapter::new(engine)) as Box<dyn MetadataAdapter>
}
Fabric => {
Box::new(FabricMetadataAdapter::new(engine)) as Box<dyn MetadataAdapter>
}
ClickHouse => Box::new(ClickHouseMetadataAdapter::new(engine))
as Box<dyn MetadataAdapter>,
Exasol => {
Box::new(ExasolMetadataAdapter::new(engine)) as Box<dyn MetadataAdapter>
}
Starburst => todo!("Starburst"),
Athena => todo!("Athena"),
Trino => todo!("Trino"),
Datafusion => todo!("Datafusion"),
Dremio => todo!("Dremio"),
Oracle => todo!("Oracle"),
};
Some(metadata_adapter)
}
}
}
/// Execute `use warehouse [name]` statement for Snowflake.
/// For other warehouses, this is noop.
/// Returns whether the connection changed and must be restored.
pub fn use_warehouse(
&self,
conn: &'_ mut dyn Connection,
warehouse: String,
node_id: &str,
token: CancellationToken,
) -> FsResult<bool> {
match self.inner_adapter() {
Replay(_, replay) => replay.replay_use_warehouse(conn, warehouse, node_id),View on GitHub (pinned to 0267ce9170)
Solutions
- Switch to an implemented adapter type (Snowflake, Bigquery, Databricks, Redshift, Postgres, DuckDB, Fabric, ClickHouse, Exasol, etc.) until Oracle is supported.
- Implement the Oracle arm: replace `Oracle => todo!("Oracle")` with `Box::new(OracleMetadataAdapter::new(engine)) as Box<dyn MetadataAdapter>` (requires writing the Oracle metadata adapter).
- Use sidecar mode so schema hydration happens via db_runner and `metadata_adapter` returns None before dispatch.
Example fix
// before
Oracle => todo!("Oracle"),
// after
Oracle => Box::new(OracleMetadataAdapter::new(engine)) as Box<dyn MetadataAdapter>, Defensive patterns
Strategy: validation
Validate before calling
impl AdapterType {
pub fn metadata_adapter_implemented(&self) -> bool {
!matches!(self,
AdapterType::Starburst | AdapterType::Athena | AdapterType::Trino
| AdapterType::Datafusion | AdapterType::Dremio | AdapterType::Oracle)
}
}
// usage: adapter.adapter_type().metadata_adapter_implemented() || return Err("Oracle not supported yet".into()); Type guard
fn oracle_not_ready(t: &AdapterType) -> bool {
matches!(t, AdapterType::Oracle)
} Try / catch
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| adapter.metadata_adapter()));
if result.is_err() {
eprintln!("Oracle metadata adapter is unimplemented; switch adapter type or use sidecar mode");
} Prevention
- Check adapter type support before configuring an Oracle target.
- Fail fast at profile validation rather than mid-run.
- Prefer engines with implemented metadata adapters (Snowflake, Postgres, etc.) where possible.
- Subscribe to project milestones for Oracle support.
When it happens
Trigger: Calling `metadata_adapter()` on a DbtAdapter whose adapter_type() is AdapterType::Oracle in non-sidecar, non-explicit-mock mode.
Common situations: Running dbt with an Oracle profile before Oracle support is added; migrating an existing Oracle dbt project to this Rust adapter; CI jobs that exercise all adapter types.
Related errors
AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07).
Data as JSON: /api/errors/9136b446b50a4f33.
Report an issue: GitHub.