dbt-labs/dbt-core · error

enrich constraints must contain TypedConstraint objects

Error message

enrich constraints must contain TypedConstraint objects

What it means

The constraints sequence passed to relation_enrich iterated fine, but its items do not downcast to TypedConstraint objects — the list holds plain dicts/values instead of constraint wrappers, so per-item downcasting fails.

Solutions

  1. Build constraints through the typed API rather than raw dicts
  2. Convert dict-shaped constraints into TypedConstraint before calling enrich
  3. Validate/filter items before attempting the downcast
Defensive patterns

Strategy: type-guard

When it happens

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

Appendix: source

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

                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())
    }

    /// Databricks: render constraints DDL for CREATE TABLE
    fn relation_render_constraints_for_create(self: &Arc<Self>) -> Result<Value, minijinja::Error> {
        let dbx = self
            .relation
            .as_any()
            .downcast_ref::<Relation>()
            .ok_or_else(|| {
                minijinja::Error::new(

View on GitHub (pinned to 0267ce9170)