dbt-labs/dbt-core · error

metadata query plan always includes metadata operation

Error message

metadata query plan always includes metadata operation

What it means

Internal invariant expect in list_relations_in_parallel_inner_with_options: building the Snowflake list-relations query plan must always yield a plan containing the metadata operation, and the unwrap of that construction failed. This is not user input related — it fires only if the query-plan builder regresses or returns an unexpected plan shape.

Solutions

  1. Inspect the metadata query plan construction (snowflake_list_relations_query_plan) for changes that drop the metadata operation
  2. Report as an internal bug — no adapter configuration triggers this
  3. Add a regression test pinning the metadata operation in the generated plan
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/dbt-adapter/src/metadata/snowflake/mod.rs:847 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/cca6690810bcc4c4. Report an issue: GitHub.

Appendix: source

Thrown at crates/dbt-adapter/src/metadata/snowflake/mod.rs:847

            metadata_warehouse.clone(),
            token.clone(),
            Box::new(AdapterConnectionFactory::new(
                self.adapter.engine().clone(),
                self.adapter.engine().threads(),
            )),
        ));

        let adapter = self.adapter.clone();
        let token_clone = token.clone();

        let map_f = move |conn: &'_ mut dyn Connection,
                          db_schema: &CatalogAndSchema|
              -> AdapterResult<Vec<Arc<dyn BaseRelation>>> {
            let plan = snowflake_list_relations_query_plan(metadata_warehouse.as_deref());
            let _metadata_operation = plan
                .statements
                .last()
                .expect("metadata query plan always includes metadata operation");
            let query_ctx = QueryCtx::default().with_desc("list_relations_in_parallel");
            adapter.list_relations(&query_ctx, conn, db_schema, token_clone.clone())
        };

        let reduce_f = move |acc: &mut Acc,
                             db_schema: CatalogAndSchema,
                             relations: AdapterResult<Vec<Arc<dyn BaseRelation>>>|
              -> Result<(), Cancellable<AdapterError>> {
            match relations {
                Ok(relations) => {
                    acc.insert(db_schema, Ok(relations));
                    Ok(())
                }
                Err(e) => {
                    // Empty schema error code - no relations in this schema
                    // XXX: The AdapterError struct is not properly being built at the moment, rely on string search for now
                    if e.message().contains("Object does not exist") {
                        acc.insert(db_schema, Ok(Vec::new()));

View on GitHub (pinned to 0267ce9170)