dbt-labs/dbt-core · error

enrich constraints must be iterable

Error message

enrich constraints must be iterable: {e}

What it means

The constraints argument passed to relation_enrich cannot be iterated — try_iter failed, meaning the value is not a Jinja sequence/list (e.g. a single object or undefined), so it cannot be converted into Vec<TypedConstraint>.

Solutions

  1. Pass constraints as a list of constraint objects from the model contract
  2. Guard with an is-iterable check in the macro before calling enrich
  3. Coerce single values into a one-element list
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at crates/dbt-adapter/src/relation/relation_object.rs:109 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/66312a0621d2a9e0. Report an issue: GitHub.

Appendix: source

Thrown at crates/dbt-adapter/src/relation/relation_object.rs:109

    }

    /// Databricks: enrich relation with constraints (for get_column_and_constraints_sql)
    fn relation_enrich(self: &Arc<Self>, args: &[Value]) -> Result<Value, minijinja::Error> {
        let dbx = self
            .relation
            .as_any()
            .downcast_ref::<Relation>()
            .ok_or_else(|| {
                minijinja::Error::new(
                    minijinja::ErrorKind::InvalidOperation,
                    "enrich is only available for Databricks relations",
                )
            })?;
        let constraints_val = args.first().cloned().unwrap_or_default();
        let constraints: Vec<TypedConstraint> = constraints_val
            .try_iter()
            .map_err(|e| {
                minijinja::Error::new(
                    minijinja::ErrorKind::InvalidOperation,
                    format!("enrich constraints must be iterable: {e}"),
                )
            })?
            .map(|v| {
                v.downcast_object_ref::<TypedConstraint>()
                    .cloned()
                    .ok_or_else(|| {
                        minijinja::Error::new(
                            minijinja::ErrorKind::InvalidOperation,
                            "enrich constraints must contain TypedConstraint objects",
                        )
                    })
            })
            .collect::<Result<Vec<_>, _>>()?;
        let enriched = dbx.enrich(&constraints);
        Ok(RelationObject::new(Arc::new(enriched)).into_value())
    }

View on GitHub (pinned to 0267ce9170)